等待Ajax调用完成

时间:2012-11-06 12:31:14

标签: ajax jquery

我有一种情况,我在使用jquery进行大量的AJAX调用,然后将这些调用中的JSON数据返回到页面上的某些变量中。 问题是Ajax调用需要一点时间来处理,同时我的控制转移到下一个语句,我打算使用AJAX调用的输出。 由于调用需要时间来返回数据,因此我留下的空对象使我的功能失效。 有没有什么方法可以等待AJAX​​调用的结束发生,只有当从调用返回结果时才继续???

所以这是我的代码,我试图将transactionsAtError返回到其他jquery文件,其中控件在执行此调用之前转移到下一个语句

this.GetTransactionAtErrors = function (callback) {
        var transactionsAtError;
        $.ajax({
            url: ('/Management/GetTransactionsAtError'),
            type: 'POST',
            cache: false,
            success: function (result) {
                if (result && callback) {
                    transactionsAtError = (typeof (result) == "object") ? result : $.parseJSON(result);
                }
            }
        });
        return transactionsAtError;
    }

2 个答案:

答案 0 :(得分:2)

假设您正在使用jQuery的$.getJSON()函数,您可以提供一个回调函数,该函数将在从服务器返回数据后执行。

示例:

$.getJSON("http://example.com/get_json/url", function(data){
    console.log("the json data is:",data);
});

修改

看到你添加的代码后,我可以看到你的问题。

你的return transactionsAtError;行独立于ajax调用运行,即它将在ajax完成之前运行。

你应该在成功中调用你的回调函数。

示例:

this.GetTransactionAtErrors = function (callback) {
    $.ajax({
        url: ('/Management/GetTransactionsAtError'),
        type: 'POST',
        cache: false,
        success: function (result) {
            if (result && callback) {
                var transactionsAtError = (typeof (result) == "object") ? result : $.parseJSON(result);
                callback(transactionsAtError);
            }
        }
    });
}

答案 1 :(得分:0)

如果你的结果在范围内,你可以通过使用es6承诺检查等待ajax调用完成:

function ajaxwait()
{
    return(new Promise(function(resolve, reject) {        
    var i = setInterval(function() { 
        if(jQuery.active == 0) {
            resolve();
            clearInterval(i);
        }
    }, 100);        
    }));    
}

你可以使用它。

ajaxwait().then(function(){ /* Code gets executed if there are no more ajax calls in progress */ });

使用像https://github.com/jakearchibald/es6-promise这样的es6垫片,使其在旧浏览器中运行。