在.each()中$ .when(...)。done(...) - 循环似乎是异步的......?

时间:2017-08-03 12:35:49

标签: javascript jquery ajax asynchronous .when

我目前正试图通过重构它来使用async: false来放弃AJAX已弃用的$.when(...).done(...)选项。到目前为止,结构看起来像这样:

$.when($(...).each(function() {
    $.when($.ajax({
        ...
    }),$.ajax({
        ...
    }),$.ajax({
        ...
    })).done(function() {   //function A
        // run as soon as all three AJAX requests in this loop are finished
    });
})).done(function() {   //function B
    // run as soon as $.when().done() of each loop is finished
});

所以基本上我想要一个.each() - 循环,它在所有请求完成后异步运行三个独立的AJAX请求和函数A中的代码。到目前为止,这部分工作。

现在的问题是我想在.each() - 循环完成后立即执行函数B中的代码,这意味着每个循环的所有AJAX请求和函数A应该已经执行过到达功能B.但似乎循环内的$.when(...).done(...)本身是异步的,因此.each() - 循环在内部$.when(...).done(...) - 函数之前完成,过早执行函数B.有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

所以我基本上解决了这个问题:

var promises = [];
$(...).each(function() {
    var deferred = $.Deferred();
    promises.push(deferred.promise());
    $.when($.ajax({
        ...
    }),$.ajax({
        ...
    }),$.ajax({
        ...
    })).done(function() { //function A
        ...
        deferred.resolve();
    });
});

$.when.apply($, promises).done(function() {   //function B
    ...
});

在每次迭代开始时,我正在初始化Deferred对象并将其Promise对象推送到数组中。每次传递函数A时,相应的Deferred对象都会被解析。一旦解析了数组中的每个Promise,函数B就会运行。所以基本上,一旦每次执行完成了函数A,函数B就会运行。对我来说就像是一种魅力。