我有许多 ajax 调用,每个调用都会触发其他 ajax 调用。然后我想等待后者以处理来自它们的数据。这是(伪)代码:https ://gist.github.com/2795435
问题是第二个$.when-always
表达式的回调函数在promises2
数组的所有延迟都被解析/拒绝之前被触发。怎么会这样?正如我所看到的,第一个$.when-always
回调将不会被调用,直到 promises1 数组的所有延迟都被解决/拒绝,并且到那时所有 ajax 调用都已经完成,因此在所有延迟之前不应该调用promises2
第二个回调已解决/拒绝$.when-always
。promises2
1 回答
看起来,在await()
jQuery中,总是在触发与lastpromises1
关联的回调之前触发回调以进行响应。因此,在 中,当内部触发其始终回调时,数组缺少一个承诺。 getJson
await()
promises2
.when()
如果我是对的,那么您应该能够运行测试以显示(.get()
每个 json 响应一个),在每种情况下,除了一个内部.get
s(永远不会更多也永远不会更少)将在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()