-1

我有一种情况,我正在使用 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;
    }
4

2 回答 2

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);
            }
        }
    });
}
于 2012-11-06T12:34:23.470 回答
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 */ });

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

于 2015-09-04T07:59:47.487 回答