我有Id的列表,我希望所有联系我的API。
我这样做是这样的:
var someFunct = function() {
for (var i = 0; i < Apples.length; i++) {
var Apple = Apples[i];
$http.get("APIUrl" + Apple.Id).
success(function (response) {
for (var i = 0; i < response.Appleseeds.length; i++) {
if(Apple.Appleseeds.Id == response.Appleseeds.Id)
{
Apple.Size = response.Appleseeds.Size;
}
}
})
}
问题在于Apple[2]
已更改了值,其中Apple[0]
和Apple[1]
保持不变。 response.Appleseeds
有自己的ID列表。因此,我需要更改所有应用程序的大小,而不仅仅是Apple[2]
。
答案 0 :(得分:5)
你关闭,改为使用闭包:
var someFunct = function () {
for (var i = 0; i < Apples.length; i++) {
(function (Apple) {
$http.get("APIUrl" + Apple.Id)
.success(function (response) {
for (var i = 0; i < response.Appleseeds.length; i++) {
if (Apple.Appleseeds.Id == response.Appleseeds.Id) {
Apple.Size = response.Appleseeds.Size;
}
}
});
})(Apples[i]);
}
};
由于http
不会立即发生,因此当您的代码中最后一次成功发生时,苹果已被更改。通过将其包装在一个封闭中,您可以使每个调用都拥有它自己的私有Apple。
答案 1 :(得分:1)
var deferred = $q.defer();
var someFunct = function() {
for (var i = 0; i < Apples.length; i++) {
$http.get("APIUrl" + Apples[i].Id).
success(function (response) {
deferred.resolve(response)
})
return deferred.promise;
}
}
someFunct().then(function(d)){
// write your code here
}