在函数中等待ajax完成

时间:2017-01-12 01:53:33

标签: javascript jquery

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

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()完成ajax完成。如果ajax没有完成,globalVariable不等于1.

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

3 个答案:

答案 0 :(得分:0)

您的功能正在运行。只是它正在不时地运行。如果您想在foo()运行时停止其他进程,请将 async 设置为 false

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

答案 1 :(得分:0)

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

var bar = function(){
  pass=true;
}

然后foo将成为

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

拨打foo

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

答案 2 :(得分:0)

代码段遵循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;
        }
    });