2015-08-06 6 views
1

У меня есть список идентификаторов, и я хочу всех из них, чтобы связаться с моим 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 имеют свой собственный список идентификаторов. Поэтому мне нужно изменить размер ВСЕХ ЯБЛОКОВ не только Apple[2].

ответ

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.

+0

Его работа! Спасибо ! через 3 мин я даю вам «Правильный ответ»: D Нужно читать о закрытии .. – None

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 
    } 
+0

это тоже хороший ответ .. – None

Смежные вопросы