2010-01-19 54 views
0

我有一個簡單的點擊功能,下面的代碼,但我似乎無法獲得第一次點擊的數據。Drupal Ajax數據檢索延遲

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { testit = result; }, 
    dataType: 'json', 
    data: 'js=1' 
}); 
alert(testit); 

在我的回調函數中,我只是返回drupal_json('hello');但直到第二次才顯示出來。例如,如果我點擊按鈕,什麼都不會發生,但是如果我再次點擊它,它會提醒'你好'。在有動態數據的情況下,它也會被延遲一次點擊。例如,假設第一次點擊應該提醒1,第二次應該提醒2,等等。相反,第一次點擊什麼也不做,第二次點擊會提醒1,第三次點擊會提醒2,等等。任何想法爲什麼會發生?謝謝。

回答

0

a in ajax代表異步。因此,testit不會被設置爲阿賈克斯的反應的結果,直到success:函數被調用(當Ajax調用成功完成)

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { testit = result; alert(testit); }, 
    dataType: 'json', 
    data: 'js=1' 
}); 

,如果你想它同步工作,還可以設置aysnc:false在jQuery的.ajax選項,就像這樣:

var testit = $.ajax({ 
    type: 'POST', 
    async: false, 
    url: 'test/get/1', 
    dataType: 'json', 
    data: 'js=1' 
}).responseText; 

alert(testit); 
在第二種方法

,所有的JavaScript將推遲至Ajax調用完成後(通常明顯慢)。我建議你在第一個例子的success:回調中做你的代碼。但是,您也可能想要創建一個error:回調函數,以防萬一發生錯誤(否則您的回調函數可能永遠不會被調用,因爲沒有成功)。

+0

謝謝,學到新的東西。 – Wade 2010-01-19 01:20:51

0

這可能是因爲AJAX請求不會阻止腳本。它繼續前進併發出請求,但不會等待結果返回,然後再執行下一行(警報)。因此,它第一次觸發警報時,沒有數據被提取,第二次只有第一個請求的數據(第二個請求已經啓動,但沒有完成),依此類推。

解決的辦法是把警報在回調函數,它沒有得到,直到已接收到響應後執行:

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { alert(result); }, 
    dataType: 'json', 
    data: 'js=1' 
}); 
+0

感謝您的替代解決方案。我確實需要稍後使用這個變量,所以我將使用異步解決方案。 – Wade 2010-01-19 01:21:46