Javascript $q.all在then子句中
在承诺链Javascript $q.all在then子句中,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,在承诺链then子句中使用$q.all的正确方法是什么 下面是一些伪类型代码来说明我要做的事情 function nestedPromise(val) { return aPromiseReturningFunction(val) .then($q.all(val.arrayProperty.map(function(anotherVal) { return anotherPromiseReturningFunction({
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
时返回的其中一个承诺被拒绝
我不能发布我试图让它工作的所有东西,因为我觉得我已经尝试了所有东西…catch
es到处都是,使用deferred
,等等。我想在某一点上,我通过使用大量的延期和catch
es,让事情“工作”起来,但它真的很难看,而且肯定不起作用,因为我知道我在做什么
我的$q.all
调用中的所有函数调用都是并行运行的吗?这似乎是目前正在发生的事情,因为即使一个承诺被拒绝,其余的承诺仍在继续。目前,我可以处理这种行为,尽管它看起来不太正确,我想知道在遇到第一次拒绝后如何停止执行。then()
希望向它传递一个函数。您当前正在传递另一个Promise对象
然后($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
});
})
});
}
然后
接受一个函数,我真的不知道$q
但是看起来你可以这样做:val=>$q.all(…)
。我真的不知道您是否希望$q.all
中的val
与nestedPromise
函数的参数或promise的解析值相同。将返回$q.all(/*…*/)的函数传递给then
函数
,即一个承诺。谢谢你的回答,@LoremIpsum!你是说把$q分解成一个单独的函数,然后在我的中调用它,那么
?那在功能上与我所做的不同呢?@MinusFour-在这种情况下,我的意图是val
总是指向传递的值你的建议(val=>$q.all(…)
)如果我想将aPromiseReturningFunction
返回的值传递到调用$q.all
,对吗?这不是我想做的。看起来,很有希望!我现在无法测试它。我会尽快报告。非常感谢您的回答!这肯定有效。但是,如果我在中破坏匿名函数e> 然后
变成一个单独的函数,它就停止工作了。为什么会这样呢?还有,你对$q.all中的承诺有什么见解吗?遇到第一次拒绝时不要停止运行?你可以将匿名函数分解成一个单独的函数,只要它返回一个承诺
。$q.all()
在第一次拒绝中停止,这是出于设计,它要么等待所有承诺得到解决,要么在执行过程中发生拒绝时拒绝。我想你误解了我的评论。如果我将匿名函数复制并粘贴到单独的函数中(其返回值为$q.all
),它停止工作,也就是说,nestedPromise
的返回值已解析。下面是代码片段的简明版本:。然后(addother(val))
,函数addother(val){return$q.all(…);}
。关于第二个问题,我不是问如果只有一个孩子的承诺被拒绝,为什么它会拒绝。我是问为什么它会在遇到第一次拒绝后继续运行剩余的承诺。你能提供一个要点或一个代码笔吗,看看你的代码实际上是什么样子会更有帮助。