等待 AJAX,然后再继续执行单独的函数

Wait for AJAX before continuing through separate function

本文关键字:单独 函数 执行 再继续 AJAX 然后 等待      更新时间:2023-09-26

好吧...凌晨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();
        }
    });
}