我循环遍历几个项目并为每个项目发出ajax请求(使用jQuery)。我希望它们独立执行,但是按照它们被调用的顺序填充到DOM中,而不是它们被返回的顺序(由于某种原因,某些请求比其他请求花费的时间更长)。关于此类事情的最佳实践的任何提示?
答案 0 :(得分:8)
结果可以以任何未定义的顺序返回,它们是异步的,受制于互联网和服务器的变幻莫测。
您可以做的是以与TCP相同的方式处理问题。您使用序列标识符。
保留序列标识符,并在每次发出请求时递增它。当请求返回时,请按顺序检查它们,并仅在它们进入时处理它们。按顺序保存一个返回的数据列表,并在每次更新后检查该列表。当第一个预期值出现时,它应该将整个列表处理到第一个间隙。
请记住,您可能会丢失请求,因此在忽略给定的序列标识符之前,合适的超时将是有序的。
答案 1 :(得分:4)
这个问题的答案最终成为了一个名为ajaxManager的jQuery插件。这完全符合我的需要:
答案 2 :(得分:1)
您可以将所有成功结果对象发送到队列。有一个与原始请求一起发送的索引,并不断检查该队列是否有下一个索引。
但通常浏览器只允许两个同时的ajax请求,因此在上一次请求成功时发送下一个ajax请求可能是值得的。
以下是代码的开头:
var results = {}, lastProcessedIndex = 0;
var totalLength = $('a.myselector').each(function(el, index){
$.ajax({
url: $(this).attr('href'),
success: function(result){
results[index] = result; // add to results object
}
});
}).length;
var intervalId = setInterval(function(){
if(results[lastProcessedIndex]){
// use object
lastProcessedIndex++;
}
else if(totalLength == lastProcessedIndex){
clearInterval(intervalId);
}
}, 1000); // every 1 second
答案 3 :(得分:0)
我会在黑暗中用这个刺,但它可能会有所帮助。也许你可以创建一个全局缓冲区数组,然后每当AJAX返回时你都可以将结果添加到缓冲区。然后,您可以设置一个计时器,当触发时,将检查缓冲区的内容。如果它们是有序的,它将相应地输出它。