2013-07-20 56 views
0

我有這個JS循環:的jQuery的hide()時JS循環結束

  for (var i = 0; i < jsArr.length; ++i) { 
      $.post("checkdata.php", { names: jsArr[i], platforms: "1" }) 
      .done(function(data) { 
       eval(data); 
      }); 
      } 

data是一些jQuery的CSS操縱。我有一個加載圖像,位於加載頁面時顯示的「加載圖像」div類下。 checkdata.php檢查names對API https://www.xboxleaders.com/

什麼是完成$('#loadingImg').hide();(隱藏圖像)環路和jQuery的.done過程完成後,最好的方法是什麼?

我曾想過在循環之後添加它,但並不保證checkdata已完成。

+2

您是否真的需要所有這些Ajax調用?你不能一次發送所有數據嗎? –

+0

執行'.hide'作爲你的'.done'回調的一部分。你需要跟蹤你是否在最後一次迭代。當然,如果你可以立即發送數據(謝謝@koala_dev),那麼有更少的調用,更快的響應,並且沒有跟蹤可以考慮 – 2013-07-20 22:27:39

+0

你可以發送例如'namesArr:jsArr'併發送所有圖像的數據而不是隻爲一個。 – WooCaSh

回答

1

使用計數器:

 var counter = 0; 
     for (var i = 0; i < jsArr.length; ++i) { 
     $.post("checkdata.php", { names: jsArr[i], platforms: "1" }) 
     .done(function(data) { 
      counter++; 
      eval(data); 
      if(counter == jsArr.length){ 
       $('#loadingImg').hide(); 
      } 
     }); 
     } 
+0

或使用我建議的smerny,甚至更好 –

+0

是的,你沒有必要 –

3

$ .when可用於合併延遲,並將解決,當他們都解決了。

var defs = []; 
for (var i = 0; i < jsArr.length; ++i) { 
    defs.unshift($.post("checkdata.php", { names: jsArr[i], platforms: "1" })); 
    defs[0].done(function(data) { 
    eval(data); 
    }); 
} 

$.when.apply($, defs).done(function() { 
    $('#loadingImg').hide(); 
}); 
+0

+1看起來正確,很難測試,但把延期在一個數組中,並調用$。當時是要走的路。 – adeneo

+0

我也沒有測試過它,所以把它與一粒鹽 – sabof

0

解決此問題的一個辦法是創建第二個數組,其元素數與jsArr相同。在每個.done上,將第二個數組的相應索引設置爲true。然後在每次調用.done時,檢查第二個數組的所有值是否爲真,如果是,則隱藏。 (或者您可以將新值插入第二個數組,並檢查數組的長度是否相同以使隱藏生效)

doneChecks = []; 
for (var i = 0; i < jsArr.length; ++i) { 
    $.post("checkdata.php", { names: jsArr[i], platforms: "1" }) 
     .done(function(data) { 
      doneChecks.push(true); 
      eval(data); 
      if (doneChecks.length == jsArr.length) 
       $('#loadingImg').hide(); 
    }); 
}