有条件的有条件承诺

时间:2015-04-16 10:29:31

标签: angularjs promise angular-promise

对于一个有角度的项目,我必须嵌套承诺,我遇到了我不确定我在做什么的情况。 这是我的一个代码:

return Action1().then(function (data) {
    var defer = $q.defer();
    if (data.condition) {
        $q.all([Action2(), Action3(), Action4()]).then(function () {
            defer.resolve();
        });
    } else {
        defer.reject("error_code");
    }
    return defer.promise;
});

Action1,Action2,Action3和Action4正在使用promises函数。这是很多承诺和行动取决于条件。 我可以这样做,并确保我的主要功能将始终被解决或拒绝吗?

我读到我们可以在promise函数中传递promise。 我可以这样做,这与上面相同:

return Action1().then(function (data) {
    var defer = $q.defer();
    if (data.condition) {
        defer.resolve($q.all([Action2(), Action3(), Action4()]);
    } else {
        defer.reject("error_code");
    }
    return defer.promise;
});

2 个答案:

答案 0 :(得分:3)

不,不是。如果Action2()Action3()Action4()之一做了"抛出"并拒绝$q.all(…)承诺,那么您的第一个函数将永远待定 - 您的延期是从来没有解决过。这是您在此处使用的deferred antipattern最常见的错误。

你的第二个功能确实缓解了这一点,但仍然是不必要的复杂功能。你根本不需要延期!只需直接返回承诺,然后使用$q.reject

return Action1().then(function (data) {
    if (data.condition) {
        return $q.all([Action2(), Action3(), Action4()]);
    } else {
        return $q.reject("error_code");
    }
});

或者,在then处理程序中发生这种情况时,您也可以使用throw "error_code"

答案 1 :(得分:1)

感谢您的回答,我可以在第一个代码版本上看到我的错误。我认为q.all会扰乱我。

我读了延迟反模式。它说我们不必无缘无故地创建延迟对象。

简单的例子就是:

 return Action1().then(function () {
     return $q.all([Action2(),Action3(), Action4()]);           
 });

但是由于if(data.condition)我无法做到。 我的第二个代码是唯一的方法吗?我是在案件还是我必须使用延期?

它讲的是" promisification",但是对于Angular,我不知道它是否是一件好事(libs似乎没有维护)。

干杯,