我在循环中有一个承诺,而且我不知道如何将一些范围变量传递给promise处理程序。
for(var i in superarray){
MyService.get(superarray[i].externalID).then(function(r){
console.debug(i);
});
MyService是一个工作服务,带有一个返回promise的get方法。
app.factory('MyService', function($http,$q) {
return {
get : function(itemID){
var deferred = $q.defer();
$http.get('/someresturl/'+itemID).then(function(e) {
deferred.resolve(e.data);
}, function(reason) {
deferred.reject(reason);
});
return deferred.promise;
}
});
在我的控制台中,console.debug逻辑上没有显示1,2,3,4,5。但是5,5,5,5,5。 (我的superarray中有5个元素)。
我怎样才能通过' i'我的承诺范围内的值,所以我可以在then()?
中使用它有可能吗?
答案 0 :(得分:74)
一种方法是在闭包中捕获i
:
for(var i in superarray) {
(function(i) {
MyService.get(superarray[i].externalID).then(function(r) {
console.debug(i);
});
})(i);
}
另一种方法是安排itemID
作为r
的属性重复:
for(var i in superarray){
MyService.get(superarray[i].externalID).then(function(r) {
console.debug(r.itemID);
});
};
答案 1 :(得分:15)
当您的回调运行时,i
将引用数组中的最后一个元素。您可以使用闭包并捕获i
的当前值:
for (var i in superarray){
(function(j) {
MyService.get(superarray[j].externalID).then(function(r) {
console.debug(j);
});
})(i);
}
答案 2 :(得分:5)
您可以使用内置的Array.prototype.forEach
:
superarray.forEach(function (item, index) {
MyService.get(item.externalID).then(function(r) {
console.debug(index);
});
});
答案 3 :(得分:3)
我会对已接受的解决方案发表评论,但我目前没有足够的声誉。
我认为将itemID作为r的属性重复的第二个解决方案也可以正常工作。
简单承诺处理程序:
angular.module('myApp', []).run(['MyService', function(MyService) {
superarray = [1, 2, 3, 4, 5];
for(var i in superarray) {
MyService.get(superarray[i]).then(function(returned) {
console.log(returned.id);
});
}
}]);
MyService将itemID作为返回对象的属性返回:
angular.module('myApp')
.factory('MyService', function($http,$q) {
return {
get : function(itemID){
var deferred = $q.defer();
$http.get('www.google.com').then(function(e) {
var returnObject = {
'data': e.data,
'id': itemID
};
deferred.resolve(returnObject);
}, function(reason) {
deferred.resolve(reason);
});
return deferred.promise;
}
}});
以下是一个工作示例on plnkr。
答案 4 :(得分:1)
尝试这个解决方案,我使用了$ q.all,我在数组中添加了参数。 它工作
for(var i in superarray){
$q.all([MyService.get(superarray[i].externalID), i]).then(function(results){
var r = results[0];
var i = results[1];
console.debug(i);
});
}