2012-12-11 450 views
0

我有我試圖同步調用AJAX地址驗證功能,如:JQuery的AJAX同步請​​求的行爲

function validate_address(address, city, state, zip) { 
    return $.ajax({ 
     type: 'POST', 
     url: '/ajax/address', 
     data: { 
      address: address, 
      city: city, 
      state: state, 
      zip: zip 
     }, 
     dataType: "json", 
     cache: false, 
     async: false 
    }).responseText; 
} 

之前我所說的功能,我展示一個旋轉的GIF和功能後隱藏:

$('#spinner').show(); 
var res = validate_address(address, city, state, zip); 
$('#spinner').hide(); 

的問題是show()hide()功能都得到調用後的Ajax調用完成。

我通過向服務器端的ajax調用添加了5秒的延遲來驗證這一點。在我觸發這個序列5秒後,兩個都立即調用show()hide()

在你打電話給我之前,我知道不會鼓勵同步請求。在這種情況下,我必須使用同步呼叫。我只是想試試這裏發生了什麼,以及如何解決它。

+1

「這不是你正在尋找的Ajax」,你應該使用異步請求,不管是什麼原因你可能需要鎖定瀏覽器嗎? – adeneo

+0

jQuery動畫不會等待其他功能。看看這個:http://api.jquery.com/ajaxComplete/ –

+1

爲什麼你認爲你必須做一個同步調用? Imo這是DOM不會在顯示和隱藏調用之間渲染的原因(是的,它在* ajax調用之前執行) – Bergi

回答

3

你已經返回從AJAX功能延遲,因此就使用done()

這甚至異步請求工作?

如果微調的表現仍然是緩慢的,你想更降低用戶體驗,您可以隨時使用的回調:

$('#spinner').show(1000, function() { 
    validate_address(address, city, state, zip).done(function(data) { 
     res = data; 
     $('#spinner').hide(); 
    }); 
}); 
+0

不,他確實返回了'responseText' – Bergi

+0

我添加了一些console.log調用。上面的代碼在Firefox中正常工作。在ajax調用完成之前,Safari不會動畫或記錄任何內容。 Chrome在請求之前和之後記錄日誌,但不會動態顯示任何內容。 – nathancahill

+0

@nathancahill - Bergi上面說的。刪除responseText行! – adeneo

0

怎麼樣ajaxStartajaxEnd

看看這篇文章:How can I create a "Please Wait, Loading..." animation using jQuery?

$("body").on({ 
    // When ajaxStart is fired, add 'loading' to body class 
    ajaxStart: function() { 
     $(this).addClass("loading"); // or do what you need here 
    }, 
    // When ajaxStop is fired, rmeove 'loading' from body class 
    ajaxStop: function() { 
     $(this).removeClass("loading"); // or do what you need here 
    }  
});