如何在$q下传递多个$http承诺

How to pass multiple $http promise under $q

本文关键字:http 承诺      更新时间:2023-09-26

我有一堆url,我想让GET调用一个接一个,然后加入每个url的返回数据。

我使用以下代码组合多个承诺,然后将其传递到$q.all.

var urls = _.map(urlArray, function(pUrl) {
  var promise_obj = $http.get(pUrl);
  return promise_obj;
});
$q.all(urls)
  .then(function(responses) {
      ctrl.points = _.reduce(responses, function(data, response) {
        if (elem == undefined) {
          return data.concat(response.data);
        } else {
          return data.concat(response.data[elem]);
        }
      }, []);
    }
  });

但是这不起作用,因为url变量传递给$q。一切都是空的。我假设原因是$http。get调用是异步的,所以我调用$q的时候。

所有url的值都为空。

问题是我可以有尽可能多的url,所以我不想链的响应。知道怎么让它工作吗?

我已经稍微修改了您的代码,这里有一个jsBin(尽管使用$timeout而不是$http)来展示所做的更改。

但是看到$timeout(func)$http.get都返回一个承诺(我已经做了你在过去用$http.get的数组多次做的事情),我会研究为什么urls/urlArray最终被传递到$q.all()时是undefined

我相信错误在你到达$q.all之前的某个地方。可能是一个被拒绝的承诺。

Docs for $q.all:

返回一个承诺,它将被一个数组/哈希值解析,每个值对应于承诺数组/哈希中相同索引/键处的承诺。如果任何一个承诺被拒绝,这个承诺将以相同的拒绝值被拒绝。

尝试在承诺链中添加.catch