$ q.all in then Clause

时间:2016-06-03 13:17:50

标签: javascript angularjs promise angular-promise

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

1 个答案:

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