我有一堆网址,我想一个接一个地进行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的值为空。
问题是我可以拥有尽可能多的网址,因此我不想将响应链接起来。知道如何让这个工作吗?
答案 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
。