2011-03-06 42 views
0

我是jQuery的超級新手,會喜歡一些我遇到的問題的幫助。它應該很簡單。基本上,第一個警報是空的,但是當我第二次調用變量時,它會給出預期的結果。jQuery發佈回覆沒有設置,直到第二次使用

$.post("showcolor.php", { color: "orange"}, 
    function(data) { 
    colorInfo = data; 
}); 
alert(colorInfo); //empty 
alert(colorInfo); //expected results 

有人可以向我解釋這種現象嗎?

回答

1

Ajax是異步的。這意味着請求在後臺運行,而您的代碼仍在運行。

success回調(function(data))將在請求完成時運行。在你的測試中,第5行的警報發生時就是這樣,在執行第6行之前。

在較慢的連接上,需要更長的時間,第6行也會顯示爲空。請求完成時是完全隨機的。

底線:將需要知道請求結果的任何代碼放入success回調中。

+0

爲什麼downvote?有什麼不對嗎? – 2011-03-06 20:41:44

+1

注意:jQuery的post()函數只有一個回調函數,所以我認爲如果你是jQuery的超級新手,那麼「成功回調」可能有點混亂。如果在這種情況下的函數是ajax(),那將更加明顯。 – Ivar 2011-03-06 20:48:41

0

AJAX請求異步,這意味着colorInfo = data的分配可能會比警報晚得多。

這是怎麼一回事呢:

  1. $。員額啓動異步AJAX請求,並立即長移到下一行是警報。
  2. 警報執行並打印出null,因爲服務器尚未響應。
  3. 服務器響應並調用回調函數,並將colorInfo的值分配給AJAX調用的結果
  4. 調用下一個警報並打印正確的值。

當然,這一切都是非常隨機的。如果服務器響應速度很快,則可能會得到第一個警報顯示正確的值,而另一方面,如果服務器速度較慢,則兩個警報可能會顯示錯誤的值。

所以,正確的做法是把警報成功回調裏面,因爲它是唯一的裏面,你都保證分配數據這個匿名函數:

$.post("showcolor.php", { color: "orange" }, function(data) { 
    alert(data); 
}); 
0

這是因爲Ajax請求將完成大約與第一次警報同時發生;數據尚未返回。

將警報放入函數中,而不是在Ajax請求完成時執行。

相關問題