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

时间:2015-07-12 05:56:10

标签: javascript angularjs lodash

我有一堆网址,我想一个接一个地进行GET调用,然后加入每个网址的返回数据。

我使用以下代码组合多个promises,然后将它传递给$ 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]);
        }
      }, []);

    }
  });

但这不起作用,因为传递给$ q.all的urls变量为空。我假设原因是$ http.get调用是异步的,所以当我调用$ q.all时,url的值为空。

问题是我可以拥有尽可能多的网址,因此我不想将响应链接起来。知道如何让这个工作吗?

1 个答案:

答案 0 :(得分:0)

我已经稍微修改了您的代码,这里是jsBin(尽管使用<style name="FullyTranslucent" parent="android:Theme.Translucent.NoTitleBar"> <item name="android:progressBarStyle">@style/InvisibleProgress</item> </style> <style name="InvisibleProgress"> <item name="android:visibility">gone</item> </style> 代替<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" android:theme="@style/FullyTranslucent" /> )来展示所做的更改。

但是看看$timeout$http两者都返回了一个承诺(我已经用{{1}数组完成了你过去多次做过的事情。我会调查为什么$timeout(func)在被传递到$http.get时最终成为$http.get

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

urls/urlArray的文档:

  

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

尝试在promise链中添加undefined