$q.all 在 then 子句中

$q.all in a then Clause

在承诺链 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 的调用中返回的承诺之一被拒绝。

我无法post我尝试过的所有事情都无法使它正常工作,因为我觉得我已经尝试了几乎所有的事情......catch到处都是,使用deferred, 等等。我想我曾通过使用大量的延迟和 catches 得到了 "working" 的东西,但它真的很丑而且它肯定没有用,因为我知道我是什么做。

我对 运行 的 $q.all 并行调用中的所有函数调用是否符合预期行为?这似乎是目前正在发生的事情,因为即使在一个承诺被拒绝后,其余的继续 运行。目前,我可以处理这种行为,虽然它看起来不太正确,我想知道如何在遇到第一次拒绝后停止执行。

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
          });
        })
      });
}