0
var request3 = 
window.SendAjax(window.siteRoot + "Home/GetTweets", "{}", function(msg) {
    //tweet
    $.each(msg, function(i, value) {
       ...

    });
    console.log("loop done");
});


$.when(request1, request3).then(function () {
  console.log(feedItems);
});

我正在尝试使用 $.when() jQuery 方法。我有 3 个 AJAX 方法可以获取数据然后对数据执行循环。$.when 在 AJAX 异步完成时执行,我需要它等到循环完成。我没有展示所有代码,但是有 3 个 AJAX 调用获取数据然后执行循环。当所有三个都完成后,然后做一些事情。想法?

4

3 回答 3

2

我假设SendAjax()看起来像这样:

function SendAjax(url, data, callback) {
    return $.ajax({
        ...
        success: callback,
        ...
    });
}

如果是这样,请将其更改为以下内容:

function SendAjax(url, data, callback) {
    var def = $.Deferred();
    return $.ajax({
        ...
        success: function() {
            callback();
            def.resolve();
        },
        ...
    });
    return def.promise();
}

然后你可以这样做:

var ajax1 = SendAjax(...);
var ajax2 = SendAjax(...);
var ajax3 = SendAjax(...);

$.when(ajax1, ajax2, ajax3).done(function() {
    //do stuff
});
于 2013-08-16T17:34:04.120 回答
0

我自己也遇到了类似的问题。我在 while 循环中运行了一系列 ajax 请求。有些电话没有被打!它杀了我!我的结论是我的浏览器——谷歌浏览器——忽略了“重复”请求。

看看这个伪代码:

while (i < ajaxCallArray.length) {
    currentAjaxObject = ajaxCallArray[i];
    ajaxPost = $.post(currentAjaxObject.url, function(data) {
    //response data needs to go into a function such that each request gets its own "data" variable created.otherwise it just overwrites data!!
    processAjaxResponse(data, currentAjaxObject);
        },"json");
i++;
}

如果ajaxCallArray[0].url = "http://www.google.com", ajaxCallArray[1].url = "http://www.google.com", 并且ajaxCallArray[2].url = "http://www.google.com"浏览器实际上只会进行 1 次调用!!

解决方案:您必须执行类似ajaxCallArray[0].url = "http://www.google.com?count=0",的操作ajaxCallArray[1].url = "http://www.google.com?count=0"ajaxCallArray[2].url = "http://www.google.com?count=0"即使您不使用这些 url 参数,也只需添加一些内容以使它们与众不同。这样浏览器将处理所有调用,即使它们是立即完成的。

希望这可以帮助!!

于 2013-09-01T18:40:14.840 回答
0

最简单的事情是计数器和检查:

var counter = 0;

$.ajax('....', function(data) {
    ... do your processing loop here
    counter++;
    if (counter >= 3) {
        do_the_post_counter_stuff();
    }
});

当每个 ajax 响应处理程序完成时,它会增加计数器并检查它是否超过限制。如果超出限制,它只会调用您的“向前移动”功能。

于 2013-08-16T17:26:05.980 回答