Promise API - 结合2个异步调用的结果

bsr*_*bsr 17 javascript promise angularjs

使用promise API,如何并行发送两个异步请求,并将组合结果解析为响应.

var get = function(id){
            var res1, res2;
            var deferred = $q.defer();
            Db.get(id, "abc")
                .then(function (d) {
                    //deferred.resolve(d));
                    res1 = d;
                }, function (e) {
                    //error
                });

            Db.get(id, "def")
                .then(function (d) {
                    //deferred.resolve(d));
                    res2 = d;
                }, function (e) {
                    //error
                });

            //?????? how to return {res1:res1 , res2: res2}

            return deferred.promise;
        };
Run Code Online (Sandbox Code Playgroud)

现在,当我调用get()之类的时候

get(123).then(function(d)){
// d= {res1: res1, res2: res2}
},
...
Run Code Online (Sandbox Code Playgroud)

我需要得到所示的综合结果.如何使用Angular promise API执行此操作?

For*_*say 36

正如@Matt所说,你需要使用$q.all,但用法并不完全正确.AngularJS不支持.done并且.fail它们不能完全相同,因为没有对多个值的承诺,而是你只对数组有一个承诺.

如果你用完整的Q写这个,我们会写:

var get = function (id) {
    return Q.all([Db.get(id, "abc"), Db.get(id, "def")])
        .spread(function (res1, res2) {
            return {res1: res1, res2: res2};
        });//the error case is handled automatically
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,除了它通过其函数的参数传播数组的结果以外的.spread行为.要改变它以使用AngularJS中的promise方法,我们只需要不用.这导致以下解决方案:.thenonFulfilled.spread

var get = function (id) {
    return $q.all([Db.get(id, "abc"), Db.get(id, "def")])
        .then(function (res) {
            return {res1: res[0], res2: res[1]};
        });//the error case is handled automatically
};
Run Code Online (Sandbox Code Playgroud)

这样做的好处在于,我们可以免于处理错误传播的所有细节和存储部分结果,因为它.then可以充当过滤器.如果省略错误处理程序,它会自动传播任何错误.这意味着如果任何一个输入承诺被拒绝,结果将被拒绝.如果两个promise都成功完成,则res是这些分辨率值的数组.