我有兩個輸入文本字段和一個「保存」按鈕。設置間隔的方式來確保Ajax調用完成?
<input type="text" id="myInput" />
<input type="text" id="searchResult"/>
<button id="myButton>save</button>
的myInput
文本字段onchange事件然後發送Ajax請求得到一些數據,並顯示結果searchResult
文本字段。
保存按鈕有單擊事件它驗證輸入searchResult
文本字段爲空字符串等。如果可以,繼續保存。
$("myInput").change(function() {
var userInput = $("myInput").val(); //get value from the text field
var responseText = callAjaxToGetData(userInput): //XHR request to get some data
$("searchResult").val(responseText); //show the XHR result here
});
$("myButton").click(function() {
var searchResultField = $("searchResult").val(); //get value from the searchResult field
var isOK = validate(searchResultField); //check empty string and such
if(isOK) { saveDataViaAjax(userInput); }
});
問題
當在一些文本到文本字段,用戶類型,然後點擊「save"
按鈕,
onchange event
被觸發,callAjaxToGetData()
被調用。(XHR )之前
callAjaxToGetData()
是填寫並填寫searchResult文本字段,觸發myButtononclick event
。在onclick事件處理函數中,驗證失敗,因爲searchResult字段仍爲空。
callAjaxToGetData()
終於完成並填入searchResult文本字段。
理想情況下,callAjaxToGetData()完成第一然後用onclick事件的內部的過程中繼續進行,以便驗證不會失敗。
這似乎是很常見的情況下,人們會面對我猜,所以我想知道你們如何解決這個問題?
我想到的是把間隔爲onclick事件像下面(這需要的responseText是一個全局變量)
$("myButton").click(function() {
var interval = setInterval(function() { //call every 500ms
//if responseText is not null that means i know the ajax inside of onchange event is completed for sure.
if(responseText != null) {
clearInterval(interval);
var searchResultField = $("searchResult").val(); //get value from the searchResult field
var isOK = validate(searchResultField); //check empty string and such
if(isOK) { saveDataViaAjax(userInput); }
}
}, 500);
});
點擊保存後,您檢查一個請求是否正在進行並等待它完成,然後調用validate-save函數。另一個問題可能是如果你改變輸入速度太快,並且請求進入競爭狀態,所以你必須停止第一個或忽略它。 – jasssonpet
$ .active可以作爲一個選項。 –