2016-08-16 88 views
0

我需要通過調用一組$ http請求(通過ngResource)來創建基本層次結構,並且在任何調用未能再次嘗試時都需要進行清理。比方說,層次結構是城市 - >街道 - >人,城市可以有更多的街道和街道更多的人。AngularJS在拒絕承諾後清理

主要的代碼我使用看起來像這樣:

/* city is object with cityid: {id: cityId} */ 
function createCity(city) { 
    return City.save(null, city).$promise; 
} 

/* streets is array with objects {id: streetId, city: cityId} */ 
function createStreets() { 
    var promises = []; 
    for (var i = 0; i< streets.length; i++) { 
     promises.push(Street.save(null, streets[i]).$promise); 
    } 
    return $q.all(promises); 
} 

/* person is array with objects {id: personId, street: streetId} */ 
function createPerson() { 
    var promises = []; 
    for (var i = 0; i< person.length; i++) { 
     promises.push(Person.save(null, person[i]).$promise); 
    } 
    return $q.all(promises); 
} 

/* city is object {id: cityId} */ 
function removeCity() { 
    return City.delete(city).$promise; 
} 

/* streets array with objects as for createStreets method */ 
function removeStreets() { 
    var promises = []; 
    for (var i = 0; i< streets.length; i++) { 
     promises.push(Street.delete({id: streets[i].streetId}).$promise); 
    } 
    return $q.all(promises); 
} 

/* person array with objects as for createPerson method */ 
function removePerson() { 
    var promises = []; 
    for (var i = 0; i< person.length; i++) { 
     promises.push(Person.delete({id: person[i].personId}).$promise); 
    } 
    return $q.all(promises); 
} 

/* should clean the hierarchy in reversed order */ 
function cleanup() { 
    return removePerson() 
     .then(removeStreets) 
     .then(removeCity); 
} 

/* main method */ 
function buildHierarchy() { 
    return createCity() 
     .then(createStreets) 
     .then(createPerson) 
     .catch(cleanup); 
} 

// somewhere in the code 
buildHierarchy(); 

我希望的是,當一個錯誤將被拋出,在清除方法方法將被按順序執行。但在開發人員控制檯中,我可以看到即使方法似乎按正確的順序調用,執行也是錯誤的 - 嘗試刪除City是在移除所有人員和街道之前刪除的,這是不允許的。

有沒有人有任何想法,如何確保以正確的順序刪除對象。看起來好像在catch塊之後承諾鏈不起作用。

感謝您的任何幫助/想法。

Michal

+0

我注意到,除了'removeStreets()'和'removePerson()',所有對Person,Street,City的函數調用都具有'$ promise'屬性,並且你推送/返回它。請確認這不是一個錯誤。 – Drkdra

+0

^這。他們顯然是資源,應該返回'$ promise'。 – estus

+0

沒錯,ngResource類操作通過te $ promise返回promise。但$ q.all方法返回promise,當數組中的所有promise都被解析時,這個promise就被解析了。這不是問題。 –

回答

0

可能問題出在您的刪除功能。 removePersonremoveStreets返回promises陣列。在您的其他功能中,您返回$q.all(promises),它返回承諾。

+0

它們不會返回promise數組,而是由$ q.all()方法創建的一個promise,該方法返回承諾數組/對象的單個承諾,當所有承諾解析完成時都會解析該承諾。 –

+0

沒錯,但是你在刪除功能中沒有這樣做。你只是返回數組。 –

+0

哦,我的錯,我只是在這個例子中做的,在我的原始代碼中是正確的。對不起,我錯誤地修正了它。 –

0

感謝所有的筆記,我能夠在我的原始代碼中找到問題。我認爲在這裏提到這個問題是值得的,因爲它發生在我身上多次。

重要提示:感謝@Todd Miller評論我修正了問題中的例子,即使這不是我所遇到的問題的核心。

這是該示例中的重要組成部分,它的工作原理:

/* should clean the hierarchy in reversed order */ 
function cleanup() { 
    return removePerson() 
     .then(removeStreets) 
     .then(removeCity); 
} 

這是我的代碼在我的原始來源,沒有工作:

/* should clean the hierarchy in reversed order */ 
function cleanup() { 
    return removePerson() 
     .then(removeStreets()) 
     .then(removeCity()); 
} 

注意括號中的.then()塊。自動填充功能非常有用,但有時會誤導您。