Javascript 在继续执行单独的函数之前,请等待AJAX

Javascript 在继续执行单独的函数之前,请等待AJAX,javascript,codeigniter,jquery,Javascript,Codeigniter,Jquery,好吧。。。凌晨2点,这就是我的底线。救命啊。。。在我的笔记本电脑掉到窗外之前。:) 我尝试过使用setTimer、回调和我能想到的所有其他方法(当然还有一些其他Stackoverflow提示)。我把所有的东西都去掉了,所以只留下基本代码 我要做的是调用parseRow(),在它最后保存记录之前,我需要获取相关的类别(通过AJAX);然而,它吹过去了,所以类别总是“未定义的” AJAX代表异步。这意味着在原始代码中,saveRecord将在客户机收到服务器的响应之前执行(并且,根据$.ajax实现

好吧。。。凌晨2点,这就是我的底线。救命啊。。。在我的笔记本电脑掉到窗外之前。:)

我尝试过使用setTimer、回调和我能想到的所有其他方法(当然还有一些其他Stackoverflow提示)。我把所有的东西都去掉了,所以只留下基本代码

我要做的是调用parseRow(),在它最后保存记录之前,我需要获取相关的类别(通过AJAX);然而,它吹过去了,所以类别总是“未定义的”

AJAX代表异步。这意味着在原始代码中,
saveRecord
将在客户机收到服务器的响应之前执行(并且,根据
$.ajax
实现的不同,可能在客户机向服务器发送请求之前执行)

此外,您似乎误解了函数在JS中的工作方式<代码>var类别=自动选择类别(收款人)将类别设置为
自动选择类别的返回值
;但是代码中的
autoSelectCategory
函数不返回任何内容

另一方面,匿名函数的
数据
返回值只能由
$使用。ajax
函数(并且
$。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];

    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();
        }
    });
}
函数解析行(行){
/*另一个代码*/
自动选择类别(收款人,功能(){
保存记录(日期、支票号码、收款人、备忘录、类别、付款、存款);
});
}

函数自动选择类别(收款人、回拨){//因为他使用的是
async:false
,所以实际上
saveRecord
$之前不会执行。ajax
完成工作。但是他返回的值不正确。在
$之前定义
var数据;
。ajax
,将其设置为
成功
并在
$之后返回。ajax
应该可以工作。永远不会除非使用
async:false
@freakish是一种非常糟糕的做法,否则我应该注意到
async:false
。我甚至不知道这是可能的:)谢谢你们!这正是我想要的!async已被弃用。使用freakish的答案。freakish有更好的答案。async:false将阻止一切,并阻止页面的乐趣Actioning right.EDIT:我添加了@freakish的建议,他是为了回应penartur的回答而提出的,因为我是个白痴,没有正确地返回数据——这就是我熬夜太晚所得到的结果。以上事实上已经做到了。不过,我将实现回调。你也可以做一件事。只需自动传递所有这些参数选择category并在success中执行saveRecord,但我想更好的方法是回调函数。
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();
        }
    });
}