2010-06-29 81 views
0

爲了讓我的jQuery代碼模塊化,即可重用,我在另一個函數fetch_ajax()中放置了一個ajax()函數。我試圖用其他地方的參數fetch_ajax()撥打,應該只需運行包含的ajax()並返回響應。jQuery:一個包含ajax()函數的函數不會返回ajax()響應

但是,這並沒有發生 - 相反,fetch_ajax()顯然返回虛假太快,致電,並不會等到ajax()已完成請求並獲得響應。

下面的代碼:

fetch_ajax()功能

function fetch_ajax(url) { 
    $.ajax({ 
    type: 'GET', 
    url: url, 
    success: function(response) { 
     return response; 
    } 
    }); 
} 

調用函數:

function caller() { 
    response = fetch_ajax('script.php'); 
    alert(response); //this is always 'undefined' 
} 

fetch_ajax(),我試着不直接返回responseajax()內,但寫作它變成了一個變量,然後在ajax()之後返回那個變量 - 那沒有也沒有工作(同樣的結果)。

當我在第return response;之前在ajax()函數的內部發出第二個提醒時,我看到一個在caller()之內的一個火災。所以我在想,不知何故,fetch_ajax()不會等待包含的函數在它返回false之前執行。

我在做什麼錯?

謝謝。

回答

5

你的思路是錯誤的 - .ajax()函數被寫入不等待包含的函數。 success是一個事件監聽器,因此只要響應到達,它就會動態觸發。你可以使用同步請求或jQuery隊列來解決這個問題,但都有缺點。

查看How do I make jQuery wait for an Ajax call to finish before it returns?的同步請求解決方案。它比另一個更簡單,但是如果服務器正常停止,或者過度使用防火牆阻止了答案,或者憤怒的lolcat在路上消耗了您的請求,則會掛起瀏覽器。

+0

謝謝你,這是我需要的解釋。我認爲現在對我來說最好的方法就是將'fetch_ajax()'重寫爲'output_ajax()',如果你趕上了我的漂移。隨着少數更多的參數傳遞給這個新的函數,它也應該能夠解釋lolcats :)謝謝。 – bobsoap 2010-06-29 23:12:58

+1

+1對於憤怒的lolcats:P – grant 2011-11-30 00:28:18