我需要通過調用一組$ 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
我注意到,除了'removeStreets()'和'removePerson()',所有對Person,Street,City的函數調用都具有'$ promise'屬性,並且你推送/返回它。請確認這不是一個錯誤。 – Drkdra
^這。他們顯然是資源,應該返回'$ promise'。 – estus
沒錯,ngResource類操作通過te $ promise返回promise。但$ q.all方法返回promise,當數組中的所有promise都被解析時,這個promise就被解析了。這不是問題。 –