我有一个显示对象列表的页面。这些列表中的每一个都来自一个 ajax 调用。如何确保它们按顺序呈现?
我尝试使用此处显示的技术,但如果其中一个请求失败,它会拒绝其余请求。我的数据不依赖于以前的数据,那么我该如何修改示例并处理错误?
我有一个显示对象列表的页面。这些列表中的每一个都来自一个 ajax 调用。如何确保它们按顺序呈现?
我尝试使用此处显示的技术,但如果其中一个请求失败,它会拒绝其余请求。我的数据不依赖于以前的数据,那么我该如何修改示例并处理错误?
你知道,在另一篇文章中,我写了这个小解析器类,但我喜欢管道的这个想法。我不知道我是否非常喜欢这个例子,但是稍微调整一下,我认为它会工作得很好。我承认,不过,我还没有对此进行测试。
var urls = ["path1","path2","path3"]; // Output from string.split()
var chain = $.Deferred(); // Create the root of the chain.
var promise = chain; // Placeholder for the promise
// Build the chain
jQuery.each(urls,function(index,elem){
// Pipe the response to the "next" function
promise = promise.pipe(function(response)
{
var myurl = elem; // Get the current part
var newPromise = $.Deferred();
$.ajax
({
type: "GET",
url: myurl
}).done(function(data){
//these are your normal ajax success function params, IIRC
//do stuff with response
}).fail(function(){
//oops, it failed, oh well
//do stuff on failure
}).always(function() {
//but always resolve the sequencing promise
newPromise.resolve();
});
return newPromise;
})
});
chain.resolve();
编辑:这是一个带有模拟 ajax 请求的 JSFiddle http://jsfiddle.net/jfcox/gFLhK/。如您所见,这一切都按顺序排列。
编辑二:评论略有调整。请注意,您应该能够通过将任何内容传递给您的解析调用来将信息传递给您的下一个承诺......
编辑三:根据戴夫的建议进行修改。要进一步分离关注点,您可以always
在 ajax 请求上使用。
您可以将响应列表保存在数组中
function response () {
responseArray[i] = response; // Where i is the sequence number of request and response;
responseHandler(); // Ping some function which can take the response in the order and process it.
}
您是否尝试过使用 jQuery.when?
http://api.jquery.com/jQuery.when/
示例
http://jsfiddle.net/94PGy/4/
在多个 Deferred 的情况下,其中一个 Deferred 被拒绝,jQuery.when 立即为其主 Deferred 触发 failCallbacks。请注意,此时某些 Deferreds 可能仍未解决。如果您需要针对这种情况执行额外的处理,例如取消任何未完成的 ajax 请求,您可以在闭包中保留对底层 jqXHR 对象的引用,并在 failCallback 中检查/取消它们。