Javascript 在函数中等待ajax完成

Javascript 在函数中等待ajax完成,javascript,jquery,Javascript,Jquery,我有一个包含函数foo的对象,其中包含jQuery ajax调用 foo: function() { ... jQuery.ajax({ contentType : "application/json", type: "POST", async: true, ..., success: function(data) { global

我有一个包含函数foo的对象,其中包含jQuery ajax调用

foo: function() {
    ...
    jQuery.ajax({
            contentType : "application/json",
            type: "POST",
            async: true,
            ...,
            success: function(data) {
               globalVariable = 1;           
            },
            error: function(error) {
            }
    });
}
我的测试代码:

    var pass = true;
    myObj.foo();

    if (globalVariable !== 1) {
        pass = false;
    }
我想要语句
myObj.foo()
finishwithajaxfinish。如果ajax没有完成,则
globalVariable
不等于1


我无法在ajax中将
async
设置为
false
,因为这是生产代码。

您的函数正在运行。只是它运行不平稳。如果要在foo()运行时停止其他进程,请将async设置为false

foo: function() {
    ...
    jQuery.ajax({
            contentType : "application/json",
            type: "POST",
            async: false,
            ...,
            success: function(data) {
               globalVariable = 1;           
            },
            error: function(error) {
            }
    });
}

如果是这种情况,则改为向foo添加一个函数参数。该函数将在ajax调用完成后调用

var bar = function(){
  pass=true;
}
那么富就会变成

foo: function(func) {
    ...
    jQuery.ajax({
            contentType : "application/json",
            type: "POST",
            async: false,
            ...,
            success: function(data) {
               globalVariable = 1;
               func();           
            },
            error: function(error) {
            }
    });
}
打电话给福

var pass = false;
myObj.foo(bar);

代码片段遵循
promise
方法:

    var pass = true;
    var myObj = {
        foo: function () {
            return $.Deferred(function (deferred) {
                jQuery.ajax({
                    type: "POST",
                    url: 'https://httpbin.org/post'
                }).done(function () {
                    deferred.resolve(1);
                }).fail(function () {
                    deferred.reject();
                });
            }).promise();
        }
    };
    myObj.foo().done(function (globalVariable) {
        if (globalVariable !== 1) {
            pass = false;
        }
    });

globalVariable应设置为
1
,使用此函数,您只需等待调用完成即可。也许可以看看将回调函数传递给
foo()
,当调用
success
/
error
时,它会通知您。或者,你可以研究jQuery的承诺:不要同步地做这件事,@vule-Anh。我认为,让你的
foo
功能变得实用是现在的建议。然后,您可以在promise函数的
done
回调时检查
globalVariable
,在该回调中,该变量将作为回调中的参数传递。如果无法将
async
设置为false,则您所要求的是不可能的。Javascript是单线程的。因此,ajax代码在foo之后添加到执行队列中,并且只有在foo函数完成其循环后才会开始运行。如果您在foo函数中放入任何内容以等待ajax调用完成,那么它将永远运行,ajax调用将永远不会启动。@bob您是否可以指导我如何做到这一点?我不知道
承诺
完成
。我尝试'jQuery.when(myObj.foo()).done(function(){//checking here});。但它不起作用。@VuLeAnh,答案已经添加:)我编辑我的问题。我无法将
async:false
更改为您的注释