2012-08-05 169 views
2

我知道還有其他問題解決相同的問題,但我找不到我正確理解的答案。jQuery回調函數只發射在最後一個循環

我試圖通過循環訪問頁面名稱數組來讀取頁面數組,然後使用jQuery的$ .get函數獲取頁面內容。 我相信這是由於循環閉合,只有循環的最後一個回調觸發。 但是,我不明白這個方法或如何解決這個問題,有人可以解釋嗎?

下面是代碼:

function checkall2() 
{ 
    i = 0; 
    for(i in $servers) { 
     $.get("servers/" + $servers[i], function(result) { 
      alert(result + $servers[i]); 
     }); 
    } 
} 
+0

是$ servers一個php變量? – Ohgodwhy 2012-08-05 13:47:42

+0

不是,它是一個全局聲明的JavaScript變量,它只是一個簡單的字符串數組,包含不同的單詞,用於服務器名稱,如test1,test2,test3 – 2012-08-05 13:49:10

+0

有些人用$前綴來表示它是一個jQuery對象 – 2012-08-05 13:49:26

回答

3

我覺得這是一個範圍的問題 - 嘗試在循環中分配給地方,像這樣:

function checkall2() 
{ 
    i = 0; 
    for(i in $servers) { 
     var server = $servers[i]; 
     $.get("servers/" + server, function(result) { 
      alert(result + server); 
     }); 
    } 
} 

編輯,顯示工作$.each - >http://api.jquery.com/jQuery.each/

function checkall2() 
{ 
    $.each($servers, function(index, server) { 
     $.get("servers/" + server, function(result) { 
      alert(result + server); 
     }); 
    }); 
} 
0

你不能在循環中調用異步方法,而是要S:

function checkall2(i) 
{ 
    if(i< $servers.length) { 
     $.get("servers/" + $servers[i], function(result) { 
      alert(result + $servers[i]); 
      checkall2(++i); 
     }); 
    } 
} 
+0

'$ .ajaxSetup({async:false});'' – Ohgodwhy 2012-08-05 13:58:11

0
var $servers = [1,2,3]; 
function checkall2() 
{ 
    i = 0; 
    for(i in $servers) { 
     $.get("servers/" + $servers[i], function(result) { 
     alert(result + $servers[i]); 
     }); 
    } 
} 
checkall2(); 

該工程確定,我的機器上。你確定你的全局變量是好的?

4

這是一個範圍問題 - i正在被「覆蓋」,並且當最後觸發回調時,它們的值對於所有這些值都是相同的。

既然你使用jQuery,您可以使用一個迭代器來代替:

$.each($servers, function(i, server) { 
    $.get("servers/" + server, function(result) { 
    alert(result + server); 
    }); 
}); 

恕我直言,這看起來更清晰。

+0

謝謝,我明白爲什麼現在出現問題,這是因爲我在開火時對所有回調都是一樣的,但是您的解決方案似乎不起作用,出於某種原因,警報從未被調用。 – 2012-08-05 14:05:18

+0

我用'setTimeout'取代了'$ .get'調用,它似乎工作正常。沒有理由會在你的情況下失敗。任何錯誤? – ubik 2012-08-05 14:08:27

+0

不,沒有錯誤,只是從來沒有得到警報,如果我在警報的調試器中設置斷點,它永遠不會到達它 – 2012-08-05 14:11:14

0

好吧,我想出了爲什麼它不工作。 謝謝佩德羅向我解釋問題。 所以變量的結果每次都不一樣,沒有問題,只是因爲所有三個文件的內容完全相同,所以一旦我改變它們,我意識到結果是不同的。

$ servers [i]每次都返回相同的原因,是因爲一旦循環完成了回調,然後在那裏調用,那時我在循環結束,所以它只是返回$服務器[3]三次(因爲2是循環的結束)。

相關問題