2016-08-16 94 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()块。自动填充功能非常有用,但有时会误导您。