如何在Angular服务中调用两个promise并返回组合数据

Dof*_*ofs 1 promise angularjs

我正在调用另外两个异步服务并返回一些组合数据的服务,但是如何在AngularJS中完成.

我有一个控制器,我想称这两种方法类似于:

function ServiceC(serviceA,serviceB) {

    var dataA = serviceA.GetAsyncStuff(); //returns promise
    var dataB = serviceB.GetAsyncStuff(); //returns promise

    return 'Greetings ' + dataA + dataB;
}
Run Code Online (Sandbox Code Playgroud)

有没有比实际嵌套Then方法调用更聪明的方法:

    function ServiceC(serviceA,serviceB) {

        var dataA = serviceA.GetAsyncStuff().then(function(respA){

            var dataB = serviceB.GetAsyncStuff().then(function(respB){

                 return 'Greetings ' + respA.data + respB.data;
            });
    });
}
Run Code Online (Sandbox Code Playgroud)

这个例子当然有点简化了.

Ila*_*mer 5

这是一个演示插件:http://plnkr.co/edit/yCrbwnarVDqwC4GBxhGg?p = preview

你需要使用$q.all:

app.factory('myService', function($q, serviceA, serviceB, serviceC){

  // $http returns a response object so we need to extract the data
  var fn = function(res){
    return res.data;
  };

  var promises = [
    serviceA.GetAsyncStuff().then(fn),
    serviceB.GetAsyncStuff().then(fn)
  ];

  return $q.all(promises).then(function(data){
    // you can manipulate consolidated data here
    // data.push(serviceC);

    return data;
  });
});
Run Code Online (Sandbox Code Playgroud)

来自$ q docs:

$ Q#全(承诺);

将多个promise组合成一个promise,在解析所有输入promise时解析.

返回

返回将使用值的数组/散列解析的单个promise,每个值对应于promises数组/散列中相同索引/键的promise.如果任何承诺通过拒绝得到解决,则此结果承诺将被拒绝并具有相同的拒绝值.