1

我有许多 ajax 调用,每个调用都会触发其他 ajax 调用。然后我想等待后者以处理来自它们的数据。这是(伪)代码:https ://gist.github.com/2795435 问题是第二个$.when-always表达式的回调函数在promises2数组的所有延迟都被解析/拒绝之前被触发。怎么会这样?正如我所看到的,第一个$.when-always回调将不会被调用,直到 promises1 数组的所有延迟都被解决/拒绝,并且到那时所有 ajax 调用都已经完成,因此在所有延迟之前不应该调用promises2第二个回调已解决/拒绝$.when-alwayspromises2

4

1 回答 1

1

看起来,在await()jQuery中,总是在触发与lastpromises1关联的回调之前触发回调以进行响应。因此,在 中,当内部触发其始终回调时,数组缺少一个承诺。 getJsonawait()promises2.when()

如果我是对的,那么您应该能够运行测试以显示(.get()每个 json 响应一个),在每种情况下,除了一个内部.gets(永远不会更多也永远不会更少)将在doSomethingToTheDataStoredInSomeGlobalVariableBelow()被调用时完成。

无论我是否正确,一种解决方法(不是我确定的唯一一种)将是以下几点:

function A() {
    var promisesA = [];
    for (var i = start; i < end; i++) {
        promisesA.push( B(someUri) );
    }
    $.when.apply($, promisesA).always(function() {
        doSomethingToTheDataStoredInSomeGlobalVariableBelow();
    });
}

function B(uri) {
    var d = new $.Deferred(),
        promisesB = [];
    $.getJSON(uri, function(data) {
        someCollectionFrom_data.each(function () {
            promisesB.push($.get(someUriFrom_this, function(data) {
                extractSomeStuffFrom_data_AndStoreInSomeGlobalVariable();
            }));
        });
        $.when.apply($, promisesB).done(function() {
            d.resolve();
        }).fail(function() {
            d.reject();
        });

    }).error(function(){
        d.reject();
    });
    return d;
}

这是一个演示- 修改了代码以使其像小提琴一样工作。

在这里(除了错误),数组像以前一样promisesA填充了一个,但是这$.Deferred一次,当它们对应的解析/失败uri时,不允许这些 Deferred 自动解析。getJSON相反,每个 Deferred 都是“手动”解决的,因为它的所有关联.get()s都已解决/失败,由 functionB()的数组管理promisesB(其中将有几个实例,每个实例都在由 形成的闭包中捕获B())。

该模式可以被视为 ajax 调用 (.json()s.get()s) 的“向下”级联,而.always()s. (混合.done()//将同样适用。).fail().always()

于 2012-05-27T01:21:10.743 回答