在promise链$q.all
子句中使用then
的正确方法是什么?
这是一些伪类型代码,用于说明我尝试做的事情。
function nestedPromise(val)
{
return aPromiseReturningFunction(val)
.then($q.all(val.arrayProperty.map(function(anotherVal)
{
return anotherPromiseReturningFunction({
prop1: anotherVal.prop
});
})));
}
期望:如果对$q.all
的调用中返回的任何承诺拒绝,则nestedPromise
返回的承诺将拒绝。
实际:nestedPromise
返回的承诺已解决,即使在$q.all
的调用中返回的承诺之一被拒绝。
我无法发布我试图让它发挥作用的所有内容,因为我觉得我已经尝试了所有的一切...... catch
在所有地方,使用deferred
等我觉得有一点我得到的东西"工作"通过使用大量的延期和catch
es,但它真的很难看,它肯定没有用,因为我知道我在做什么。
我的$q.all
调用中的所有函数调用的预期行为是否并行运行?这似乎是目前正在发生的事情,因为即使一个承诺拒绝,其余的继续运行。目前,我可以处理这种行为,虽然它看起来不太正确,我想知道如何在遇到第一次拒绝后停止执行。
答案 0 :(得分:4)
then()
期望将函数传递给它。您当前正在此处传递另一个Promise对象
then($q.all(val.arrayProperty.map(function(anotherVal)
你应该这样做
function nestedPromise(val) {
return aPromiseReturningFunction(val)
.then(function() {
return $q.all(val.arrayProperty.map(function(anotherVal) {
return anotherPromiseReturningFunction({
prop1: anotherVal.prop
});
})
});
}