2012-10-23 295 views
2

我正在使用循環和$ .post來填充我的網站上的字段,但它是非常不可靠的,它的工作有時是有時它不,以及我不知道如果有人有什麼問題想法是什麼問題可能會非常感激。

for (var i = 0; i < arrayOfObjects.length; i++) { 
      var object = arrayOfObjects[i]; 

      var option = {}; 
      option['username'] = object.username; 
      option['COOKIE'] = $.cookie('Favorites'); 
      option['INITIAL'] = 'A'; 


      $.post("/user/favorite.do", option, function (resp) { 
       var obj = $.parseJSON(resp); 
       $("#AddFavorite:eq("+i+")").html(obj.txt); 

} 
+6

相當不方便。每個.post調用都是另一個http調用。爲什麼不把所有這些數據建成一個單一的結構,然後做一個單一的Ajax調用將其發送到服務器? –

+2

您需要關閉「i」的值。在回調被調用的時候,'i'的最終值是'arrayOfObjects.length' – zzzzBov

+0

如果可能的話,你應該考慮使用單個AJAX調用來處理所有事情。 –

回答

6

在遍歷數組時,i正在遞增。由於$ .post是異步的,它的成功回調會在循環結束後觸發,所以所有成功的回調都會在數組的最後一個索引處觸發i。 $。每次將是一件容易jquery way來解決它:

$.each(arrayOfObjects,function(i){ 
     var object = this; 

     var option = {}; 
     option['username'] = object.username; 
     option['COOKIE'] = $.cookie('Favorites'); 
     option['INITIAL'] = 'A'; 


     $.post("/user/favorite.do", option, function (resp) { 
      var obj = $.parseJSON(resp); 
      $("#AddFavorite:eq("+i+")").html(obj.txt); 
     }); 

}); 

然而,這仍然是這樣做的非常低效的方式。您應該將所有這些請求合併爲一個請求。

非jQuery的替代方法是:

for (var i = 0; i < arrayOfObjects.length; i++) { 
    (function(i){ 
     var object = arrayOfObjects[i]; 

     var option = {}; 
     option['username'] = object.username; 
     option['COOKIE'] = $.cookie('Favorites'); 
     option['INITIAL'] = 'A'; 


     $.post("/user/favorite.do", option, function (resp) { 
      var obj = $.parseJSON(resp); 
      $("#AddFavorite:eq("+i+")").html(obj.txt); 
     }); 
    })(i); 
} 

而且,你的$。員額可以簡化爲:

 $.post("/user/favorite.do", option, function (resp) { 
      $("#AddFavorite:eq("+i+")").html(resp.txt); 
     },"json"); 
+1

你在''.each(arrayOfObjects,function(){'? – mcwhittemore

+0

@mcwhittemore)中缺少iniaizaion,是的,謝謝。 –

+0

工作很好,我的非jQuery –

0

我由凱文·B,而它試圖在$。每個解決方案仍然沒有正確工作,所以我最終將$ .post包裝在一個函數中,我發佈了我的解決方案,因爲它可能有助於具有相同問題的人。

 fillfavorite(0); 

     function fillfavorite(i) { 
     var object = arrayOfObjects[i]; 

     var option = {}; 
     option['username'] = object.username; 
     option['COOKIE'] = $.cookie('Favorites'); 
     option['INITIAL'] = 'A'; 

     $.post("/user/favorite.do", option, function (resp) { 
      var obj = $.parseJSON(resp); 
      $("#AddFavorite:eq("+i+")").html(obj.txt); 

      var g = i+1; 

      i++; 

      if(g<arrayOfObjects.length) { fillfavorite(i);} 


     }); 


     }