等待 AJAX,然后再继续执行单独的函数
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();
}
});
}
相关文章:
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 如何使jQuery中的悬停函数单独应用于数据库映像
- “单独列搜索”上的Datatables setinterval函数
- 使用AJAX在单独的文件中调用php函数
- 我将此代码移动到一个单独的函数中,它停止工作,为什么
- 如何在单独的文件中调用函数 js.
- 从单独的类调用活动函数
- window.load上单独的javascript文件中的引用函数
- 此JavaScript函数可以单独使用,但不能与其他JavaScript函数一起使用
- Chained Promise给出了未定义的函数错误,但我可以单独执行这些函数
- 从两个单独的函数创建 JQuery 悬停
- Javascript:类构造函数基础 - 在单独的方法中定义属性
- 添加混合 javascript 函数,使内容淡入列内的另一个内容/使其适用于两个单独的列
- 在一个函数中使用来自两个单独 JSON 文件的数据
- 等待 AJAX,然后再继续执行单独的函数
- AngularJS - '控制器不是函数:单独的控制器文件
- 使用 addEventListener 在 JavaScript 中设置单独的函数参数以具有唯一的 ID
- 如何检查两个单独函数的执行结果
- 使用 jQuery 完成单独函数时执行警报
- 可以将单独函数的数组值组合在一起吗