2012-10-23 61 views
4

可能重複:
How to return AJAX response Text?在AJAX調用返回輸出之前返回的JS?

我打電話這反過來發送Ajax請求,並給出response.I'm得到的結果在回調方法,如「成功」 JavaScript方法。
這裏Ajax返回一些結果,同時javascript方法返回結果(如undefined)。
但它應該只返回ajax結果。
我發現的問題是,Javascript和Ajax都同時執行。
如何阻止它們並首先執行Ajax,並且它的結果必須發送到返回結果的函數。
任何想法是高度讚賞.. :)

+0

你可以把一個jsfiddle.net顯示發生了什麼? – JamesSwift

+0

複製http://stackoverflow.com/questions/12560879/javascript-executes-before-getting-result-from-a-ajax-call的 –

+0

它幾乎總是更好地重構你的代碼,以便爲Ajax的異步特性。 (使用同步的Ajax通常是錯誤的解決方案。)一個常用的技術是不是有你的函數返回一個值的Ajax調用完成後調用回調到返回回傳時讓它將回調作爲參數,然後。 – nnnnnn

回答

7

默認情況下,$.ajax(以及使用它的任何東西,如$.post)使異步請求。您可以通過指定async:false(請參閱documentation)使請求同步。不過,我不建議您使用同步AJAX請求,因爲它會降低性能並導致糟糕的用戶體驗。相反,考慮在結果完成時使用在成功處理程序中調用的回調。

這裏有兩個任意簡單的例子,其中我們有一個錨點,我們希望從單擊AJAX調用的結果中替換文本。兩者都做同樣的事情,但第二個是首選,因爲它保持了瀏覽器的響應。

同步:

function invokeAjaxSync() { 
    var text; 

    $.ajax({url: '/path/to/resource', async:false, success: function(result) { 
     text = result.toString(); 
    }}); // will wait until this call is complete 

    return text; 
} 

$('a.example').click(function() { 
    $(this).text(invokeAjaxSync()); // works, but the browser will be unresponsive while waiting for a response. 
}); 

異步(更好):

function invokeAjaxAsync(callback) { 
    $.ajax({url:'/path/to/resource', success: function(result) { 
     callback(result); 
    }}); 
} 


$('a.example').click(function() { 
    var $this = $(this); 

    invokeAjaxAsync(function(result) { 
     $this.text(result.toString()); 
    }); // browser will remain responsive, but still update text when the AJAX call completes. 
}); 
+0

如果我使用async:false,那麼直到ajax響應來臨,JavaScript方法將停止執行,並且在結果到來之後只有JavaScript方法返回結果? –

+0

如果您使用'async:false',您的調用方法將等待,直到收到AJAX響應(或超時或中止),然後完成函數的結果。 – HackedByChinese

+0

您可以使用同步數據鎖定瀏覽器。此外,它已被棄用。 – Yatrix