2011-11-27 29 views
2

我想在處理完所有元素的AJAX請求後處理結果。但是,我的test變量未提示正確的值。我怎樣才能做到這一點?運行代碼.each() - 始發AJAX請求已完成

var test = 0; 

$('#div :input').each(function() { 
    var loadUrl = "path_to/ajax.php?label="+value; 
    $.ajax({ 
     type: "GET", 
     url: loadUrl, 
     success: function(msg) { 
      if(msg == 1) { 
       test++; 
      } 
      else if(msg == 2) { 
       test++; 
      } 
     } 
    });      
}); 

alert(test); 
+2

這是因爲這些AJAX調用是異步的,但'警報()'立即運行。 –

+0

你有沒有試過把'alert(test);'放在'success:'中? –

+0

是的,但我想在處理完所有元素後處理結果 – klaaz

回答

0

alert()達到Ajax調用尚未完成並success回調尚未被調用。因此test仍然有其初始價值。

+0

我知道,但我試過任何東西,任何提示如何解決這個問題? – klaaz

0

因爲你所要做的是在所有的GET請求都完成時做一些事情,你應該跟蹤所有的請求,然後做一些事情。請注意,如果您嘗試聯繫可能無法返回的資源,則可能需要進行超時檢查和/或使用complete處理程序,該處理程序將在所有其他處理程序都會啓動後觸發,包括如果有錯誤,超時或whatnot(這意味着,success可能永遠不會運行,並且您的代碼可能永遠不會被告知完成)。

重要!打開Firefox中的Chrome控制檯或Firebug以查看輸出。

<div id="div"> 
    <input type="text"/> 
    <input type="text"/> 
    <input type="text"/> 
    <input type="text"/> 
    <input type="text"/> 
</div> 

console.clear(); 
var c_inputs = 0; 
var $div = $('#div'); 
var $inputs = $div.find(':input'); 
$div.data('data-inputs',$inputs.length); 
$div.data('data-messages',0); 
console.log('Number of inputs: ' + $div.data('data-inputs') + ' Number of messages: ' + $div.data('data-messages')); 

$inputs.each(function() { 
    var loadUrl = "#"; 
    $.ajax({ 
     type: "GET", 
     url: loadUrl, 
     success: function(msg) { 
      var $div = $('#div'); 
      var count = parseInt($div.data('data-messages')); 
      var inputs = parseInt($div.data('data-inputs')); 
      count++; 
      $div.data('data-messages',count); 
      console.log('Current message count: ' + count + ' == Total Inputs: ' + inputs); 
      if (count == inputs) { 
       finishedInputs(); 
      } 
     } 
    });      
}); 

function finishedInputs() { 
    console.log('Finished! (' + 
     $('#div').data('data-messages') + 
     ' of ' + 
     $('#div').data('data-inputs') + 
     ')' 
    ); 
} 

http://jsfiddle.net/msJgT/

0
var test = 0; 
var semaphore = 0; 

$('#div :input').each(function() { 
    var loadUrl = "path_to/ajax.php?label="+value; 
    semaphore++; 
    $.ajax({ 
     type: "GET", 
     url: loadUrl, 
     success: function(msg) { 
      if(msg == 1) { 
       test++; 
      } 
      else if(msg == 2) { 
       test++; 
      } 
     }, 
     complete: function() { 
      semaphore--; 
      if (semaphore == 0) { alert(test); } 
     } 
    });      
});