【发布时间】:2014-02-26 05:56:27
【问题描述】:
我搜索了许多非常相似的问题。我发现一个几乎完全符合我的要求,只是它没有任何错误处理,并且在尝试实施错误处理时我遇到了一些问题。
我的目标是创建一个接收名称数组的函数,在循环中创建 $.ajax 请求,将返回的承诺对象推送到一个数组中,然后我将其提供给 $.when.apply($,arrayOfPromises).then (// 等来解决一个 master deferred,其中 arrayOfPromises 中的所有承诺都已解决。最终结果是创建一个从 ajax 调用返回的数据数组。
到目前为止我有这个:http://jsfiddle.net/BGx2h/1/
这几乎正是我所需要的。如果数组包含指向所有有效资源的指针,那么一切似乎都按预期工作。但是,如果调用不存在的资源(例如我的小提琴中的 /test/doesnt.exist.txt),则对“doesnt.exist”的 ajax 调用在任何其他调用之前完成,主deferred (connectiondfd) 在其他调用有机会完成之前得到解决(您可能需要多次运行小提琴才能获得此结果)。这是我的函数目前的样子:
function multiAsync() {
var i,data=[],connections=[],
targets=['John.Smith','Jane.Doe','Bob.Someone','doesnt.exist'];
var connectiondfd = $.Deferred();
for(i=0;i<targets.length;i++) {
connections.push($.ajax({
url:'http://porticium.ca/test/'+targets[i]+'.txt',
type:'GET',
async:true,
timeout:5000
}).then(function(newData) {
data.push(newData);
},function() {
data.push("NO DATA");
}));
}
$.when.apply($,connections)
.then(
function() { connectiondfd.resolve(); },
function() { connectiondfd.resolve(); }
);
$.when(connectiondfd).done(function() {
alert("FINAL: " + data);
});
}
非常感谢您对此的帮助,这让我发疯了!
谢谢, 抢
【问题讨论】:
-
使用错误处理,当其中一个承诺失败时,您将获得失败处理程序并且永远不会成功。由于您失败的承诺几乎立即完成,它总是会在其余完成之前显示失败。如果这不是您想要的功能,您可能需要考虑使用延迟对象以外的其他对象,例如 $.Callbacks 对象。
-
感谢您的快速回复。我正在研究 $.Callbacks 现在。所以基本上没有办法说 $.when.apply($,listOfPromises).whenALLPromisesHaveResolvedOrRejected(function() {});以这种方式,我不只是错过了什么吗?
-
正确。一旦失败,等待就完成了。
-
我明白了,非常感谢。 $.Callbacks 看起来正是我所需要的。
标签: javascript jquery ajax promise deferred