javascript - Promise 链(angular javascript)

标签 javascript angularjs asynchronous promise chaining

所以我有几个函数都对服务进行异步调用。我不希望他们都在前一个完成后执行,但前提是前一个没有失败。它看起来像这样:

var fn1 = function() {
    var promise = aService.fn1();
    var successCallback = function(response) {
        return true;
    };
    var errorCallback = function() {
        return false;
    };
    return promise.then(successCallback, errorCallback);
};
var fn2 = function() {
    var promise = aService.fn2();
    var successCallback = function(response) {
        return true;
    };
    var errorCallback = function() {
        return false;
    };
    return promise.then(successCallback, errorCallback);
};
var fn3 = function() {
    var promise = aService.fn3();
    var successCallback = function(response) {
        return true;
    };
    var errorCallback = function() {
        return false;
    };
    return promise.then(successCallback, errorCallback);
};

fn1().then(function(resp){
    if (resp)
    {
        fn2().then(function(resp){
            if (resp)
            {
                fn3().then(function(resp){
                    if (resp)
                    {
                        // all functions have been called in order were successful
                    }
                });
            }
        });
    }
});

最后的执行看起来很糟糕,因为这个链中添加了更多的函数。我想知道是否有另一种方法可以构造它,使其表现相同但不会创建巨大的链式异步调用树。如果我能把它保持在同一个缩进上,那就太好了。谢谢!

最佳答案

您必须修改错误回调以返回 $q.reject() 而不是 false,即:

var fn1 = function() {
    var promise = aService.fn1();
    var successCallback = function(response) {
        // no return needed, unless the next stage
        // requires the results of this stage
    };
    var errorCallback = function() {
        return $q.reject();
    };
    return promise.then(successCallback, errorCallback);
};

链接变成:

fn1()
    .then(function() {
        return fn2();
    })
    .then(function() {
        return fn3();
    })
    .then(function() {
        // ALL SUCCEEDED HERE
    });

事实上,您甚至不必在 f1f2f3 中编写那些痛苦的代码,即下面的代码也可以完成工作:

aService.fn1()
    .then(function() {
        return aService.fn2();
    })
    .then(function() {
        return aService.fn3();
    })
    .then(function() {
        // ALL SUCCEEDED HERE
    });

关于javascript - Promise 链(angular javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28472959/

相关文章:

javascript - 根据用户位置查询数据库值

javascript - 我尝试在松露中部署我的智能合约,但是当我 "unsupported compiler"时说 "truffle migrate"我该如何解决这个问题?

javascript - 我无法在 cordova-sqlite-storage 中为 ionic 1 打开数据库

javascript - 在 angularjs get 方法中发送数组

javascript - 使用 bower 将 3rd 方模块安装到 yeoman 生成的 Angular 应用程序中不起作用 - 没有呈现任何内容,也没有错误

javascript - 使用 javascript 覆盖 chrome 默认快捷方式

javascript - 为什么 onChange 回调中 $scope.data 的更改不会重新绘制 chart.js?

javascript - 使用 Fetch API 发送多个请求并等待其完成后再执行另一个代码

node.js - 为 Nodejs 递归扫描 AWS Dynamo DB 的函数

c# - 将 UI 线程的 TaskScheduler 存储在字段中是否安全?