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(…);}
。关于第二个问题,我不是问如果只有一个孩子的承诺被拒绝,为什么它会拒绝。我是问为什么它会在遇到第一次拒绝后继续运行剩余的承诺。你能提供一个要点或一个代码笔吗,看看你的代码实际上是什么样子会更有帮助。