好的...凌晨 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
});
}
关于javascript - 在继续通过单独的功能之前等待 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11289884/