gla*_*ish 9 javascript jquery codeigniter
好吧......凌晨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;
}
Run Code Online (Sandbox Code Playgroud)
pen*_*tur 15
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
});
}
Run Code Online (Sandbox Code Playgroud)
fre*_*ish 11
不要使用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();
}
});
}
Run Code Online (Sandbox Code Playgroud)