我需要通过调用一组$ 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就被解析了。这不是问题。 –