我一直在研究this link的承诺,我理解它的想法
var parentID;
$http.get('/api/user/name')
.then(function(response) {
parentID = response.data['ID'];
for (var i = 0; i < response.data['event-types'].length; i++) {
return $http.get('/api/security/' + response.data['event-types'][i]['key']);
}
})
.then(function(response) {
// response only returns one result of the many promises from the for loop
// do something with parentID;
});
但是,我的用例需要循环并发送创建超过1个承诺。我试图链接一个上面的例子,但只执行了从for循环创建的唯一一个承诺。
如何继续链接所有承诺,同时继续访问变量parentID?
答案 0 :(得分:1)
您应该使用$q.all
,因为它与AngularJS摘要周期集成在一起。
var parentID;
$http.get('/api/user/name')
.then(function(response) {
parentID = response.data['ID'];
var promiseList = [];
for (var i = 0; i < response.data['event-types'].length; i++) {
var iPromise = $http.get('/api/security/' + response.data['event-types'][i]['key']);
promiseList.push(iPromise);
};
return $q.all(promiseList);
})
.then(function(responseList) {
console.log(responseList);
});
来自文档:
所有(许诺);
将多个promises组合成一个promise,当所有输入promise都被解析时解析。
<强>参数强>
承诺的数组或散列。
<强>返回强>
返回将使用值的数组/散列解析的单个promise,每个值对应于promises数组/散列中相同索引/键的promise。如果任何承诺通过拒绝得到解决,则此结果承诺将被拒绝并具有相同的拒绝价值。
答案 1 :(得分:0)
您可以使用Promise.all()
,将Array.prototype.map()
替换为for
循环
var parentID;
$http.get('/api/user/name')
.then(function(response) {
parentID = response.data['ID'];
return Promise.all(response.data['event-types'].map(function(_, i) {
return $http.get('/api/security/' + response.data['event-types'][i]['key'])
}))
})
.then(function(response) {
// response only returns one result of the many promises from the for loop
// do something with parentID;
})
.catch(function(err) {
console.log(err);
});