![](/img/trans.png)
[英]How to wait for user action in separate Modal before continuing function execution?
[英]Wait for AJAX before continuing through separate function
好吧......凌晨2點,這是我划線的地方。 幫助......在我的筆記本電腦最終走出窗外之前。 :)
我已經嘗試過使用setTimer,回調以及我能想到的其他一切(當然還有其他一些Stackoverflow提示)。 我已經刪除了所有內容,所以我只留下基本代碼。
我要做的是調用parseRow()並在最后保存記錄之前,我需要獲取相關的類別(通過AJAX); 然而,它吹過它,所以類別總是“未定義”。
function parseRow(row){
var rowArray = row.trim().split(",");
var date = rowArray[0];
var checknum = rowArray[1];
var payee = rowArray[2];
var memo = rowArray[3];
var amount = rowArray[4];
//ERROR: blows right past this one and sets the category variable BEFORE ajax returns
var category = autoSelectCategory(payee);
saveRecord(date, checkNum, payee, memo, category, payment, deposit);
}
function autoSelectCategory(payee) {
var data;
$.ajax({
async: false,
url: "autoselectcategory",
dataType: "json",
data: {
string: payee
},
success: function (returnedData) {
data = returnedData;
}
});
return data;
}
AJAX代表異步 。 這意味着在原始代碼中, saveRecord
將在客戶端從服務器接收響應之前執行(並且,根據$.ajax
實現,它可能在客戶端將請求發送到服務器之前)。
此外,您似乎誤解了JS中函數的工作原理。 var category = autoSelectCategory(payee);
將類別設置為autoSelectCategory
的返回值; 但代碼中的autoSelectCategory
函數不返回任何內容。
另一方面,匿名函數的data
返回值只能由$.ajax
函數使用( $.ajax
可能忽略success
參數返回值)。
這是應該工作的代碼:
function parseRow(row){
var rowArray = row.trim().split(",");
var date = rowArray[0];
var checknum = rowArray[1];
var payee = rowArray[2];
var memo = rowArray[3];
var amount = rowArray[4];
autoSelectCategory(payee, function (category) {
saveRecord(date, checkNum, payee, memo, category, payment, deposit);
});
}
function autoSelectCategory(payee, callback) {
$.ajax({
async: false,
url: "autoselectcategory",
dataType: "json",
data: {
string: payee
},
success: callback
});
}
不要使用async: false
選項。 這是一個純粹的邪惡(阻止瀏覽器中的所有腳本甚至其他標簽!)並且自jQuery 1.8以來它已被棄用。 你應該使用回調,因為它一直是這樣的。
function parseRow(row) {
/* the other code */
autoSelectCategory(payee, function() {
saveRecord(date, checkNum, payee, memo, category, payment, deposit);
});
}
function autoSelectCategory(payee, callback) { // <---- note the additional arg
$.ajax({
url: "autoselectcategory",
dataType: "json",
data: {
string: payee
},
success: function(res) {
/* the other code */
callback();
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.