2014-10-03 22 views
0

問題在於,當ajax調用從URL中檢索數據時,FOR會繼續,因此只有數組中的最後一個元素需要基準。 在那種情況下,我如何與ajax調用進行同步?我能做些什麼來通過ajax發出正確的對象,並進入for循環

for(ii in scope.selMovies){ 
     for(jj in scope.selMovies[ii]){ 

      var title = scope.selMovies[ii][jj].title.replace(/\s*\(.*/, ""); 
      var yearMovie = scope.selMovies[ii][jj].title.match(/\(.*(20|19)[\d]{2}/)[0].replace(/[^\d]/g, ""); 

      http.jsonp(url + "&query=" + title + callb). 
       success(function (data) { console.log(ii, jj, title, data.results); 
        for (k in data.results){ 
         if(data.results[k].release_date.substr(0, 4) == yearMovie) { 
          scope.selMovies[ii][jj].infoes = data.results[k]; 
          break; 
         } 
        } 

       } 
      ); 

     } 
    } 

回答

1

您的console.log(ii, jj, title, data.results)總是顯示最後的iijjtitle

問題不在於for循環繼續進行,而Ajax調用調用檢索數據。問題在於你的.success回調函數http.jsonp是循環內的閉包,所以它的行爲並不像人們期望的那樣。

閱讀this answer以更好地理解發生了什麼。

要解決您的具體情況,請執行以下操作:

function MakeSuccessFn(scope, ii, jj, yearMovie, title){ 
    return function (data) { 
    console.log(ii, jj, title, data.results); 
     for (k in data.results){ 
      if(data.results[k].release_date.substr(0, 4) == yearMovie) { 
      scope.selMovies[ii][jj].infoes = data.results[k]; 
      break; 
      } 
     } 

    }; 
} 

然後在循環中,改變你的http.jsonp以下

http.jsonp(url + "&query=" + title + callb) 
.success(MakeSuccessFn(scope, ii, jj, yearMovie, title)); 
1

承諾在AngularJS是異步,以便與一羣AJAX請求工作是更好地使用$q.all回答所有的請求後,處理所有的響應。

+0

你能舉個例子嗎?請。 – Donovant 2014-10-03 08:43:12

+0

https://egghead.io/lessons/angularjs-q-all – 2014-10-03 08:51:23

1

你需要在你的AJAX調用來創建一個封閉封裝在進行Ajax調用時每次循環迭代時更改的值。試試這個:

for(ii in scope.selMovies){ 
    for(jj in scope.selMovies[ii]){ 
     var title = scope.selMovies[ii][jj].title.replace(/\s*\(.*/, ""); 
     var yearMovie = scope.selMovies[ii][jj].title.match(/\(.*(20|19)[\d]{2}/)[0].replace(/[^\d]/g, ""); 
     doAjax(ii, jj, title, yearMovie); 
     } 
} 

function doAjax(count1, count2, title, yearMovie) { 
    http.jsonp(url + "&query=" + title + callb). 
     success(function (data) { console.log(count1, count2, title, data.results); 
      for (k in data.results){ 
       if(data.results[k].release_date.substr(0, 4) == yearMovie) { 
        scope.selMovies[count1][count2].infoes = data.results[k]; 
        break; 
       } 
      } 
     } 
} 
相關問題