【发布时间】:2016-06-03 13:17:49
【问题描述】:
在承诺链then 子句中使用$q.all 的正确方法是什么?
这里有一些伪类型代码来说明我正在尝试做的事情。
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 的调用中返回的承诺之一被拒绝。
我无法发布我试图让它工作的所有东西,因为我觉得我已经尝试了所有东西......catches 到处都是,使用deferred 等。我想在某一时刻通过使用大量的延期和catches,我让事情“工作”了,但这真的很难看,而且肯定没有用,因为我知道自己在做什么。
我的$q.all 调用中的所有函数调用是否都是并行运行的预期行为?这似乎是当前正在发生的事情,因为即使在一个承诺被拒绝后,其余承诺仍会继续运行。目前,我可以处理这种行为,虽然它看起来不太正确,我想知道在遇到第一次拒绝后如何停止执行。
【问题讨论】:
-
then接受一个函数,我真的不知道$q但看起来你可以这样做:val => $q.all(..)。我真的不知道你是否期望$q.all中的val与nestedPromise函数的参数或promise 的解析值相同。 -
向
then函数传递一个返回$q.all(/* ... */)的函数,即一个promise。 -
感谢您的回复,@LoremIpsum!所以你是说将
$q.all分解成一个单独的函数并在我的then中调用它?那在功能上与我正在做的事情有何不同? -
@MinusFour - 在这种情况下,我的意图是
val始终指向传递给最外层函数的值。您的建议(val => $q.all(...))是如果我想将aPromiseReturningFunction返回的值传递给$q.all的调用,对吗?这不是我想要做的。
标签: javascript angularjs promise angular-promise