【问题标题】:Angular conditional promisesAngular 条件承诺
【发布时间】:2015-06-22 16:48:25
【问题描述】:

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

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 是有效的 Promise 函数。很多承诺和行动取决于条件。 我可以这样做并确保我的主要功能将始终得到解决或拒绝吗?

我读到我们可以在 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;
});

【问题讨论】:

    标签: angularjs promise angular-promise


    【解决方案1】:

    不,不是。如果Action2()Action3()Action4() 中的一个“抛出”并拒绝$q.all(…) 承诺,那么您的第一个函数将永远挂起 - 您的延迟永远不会解决。这是您在此处使用的deferred antipattern 最常见的错误。

    您的第二个函数确实缓解了这种情况,但仍然是不必要的复杂。你根本不需要在这里延期!直接返回promise,使用$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 或抛出错误。
    【解决方案2】:

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

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

    简单的情况是这样的:

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

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

    它谈到了“承诺”,但对于 Angular,我不知道这是否是一件好事(库似乎没有维护)。

    干杯,

    【讨论】:

    • 是的,您应该仅将延迟用于承诺。虽然在 Angular 中,两个最常用的异步方法 $http$timeout 已经返回承诺,所以你很少需要它。
    • 在 Angular 1.3 中,我看到他们为 $q 构造函数引入了一种新语法。你怎么看待这件事?使用它是一个好习惯吗?
    • 一个对的,一个promise构造函数。是的,使用它而不是延迟是一个好习惯,它是承诺的新标准。但是“延迟反模式”仍然是相同的,也许是“承诺构造函数反模式”。当你使用的函数已经返回 Promise 时,不要使用它们。
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 2021-08-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多