Angular 有条件的承诺

Angular conditional promises

对于 angular 项目,我必须将 promises 和 运行 嵌套到我不确定自己在做什么的情况下。 这是我的代码之一:

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

A​​ction1、Action2、Action3 和 Action4 正在运行承诺函数。很多承诺和行动取决于条件。 我可以这样做并确保我的主要功能始终得到解决或拒绝吗?

我读到我们可以在 resolve 函数中传递 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;
});

不,不是。如果 Action2()Action3()Action4() 中的一个执行了 "throw",并且拒绝了 $q.all(…) 承诺,您的第一个函数将永远挂起 - 那么您的延期永远不会得到解决.这是您在此处使用的 deferred antipattern 最常见的错误。

你的第二个函数确实缓解了这个问题,但仍然不必要地复杂。你根本不需要在这里延期!直接 return 承诺,然后使用 $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".

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

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

简单的情况是这样的:

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

但是由于 if (data.condition) 我不能这样做。 我的第二个代码是唯一的方法吗?我是在案件中还是必须使用延迟?

它谈到了 "promisification",但是 Angular 我不知道这是否是一件好事(库似乎没有维护)。

干杯,