在进行多个ajax回调时保持请求的顺序

我循环遍历几个项目并为每个项目发出ajax请求(使用jQuery)。 我希望它们独立执行,但按照它们被调用的顺序填充到DOM中,而不是它们返回的顺序(由于某种原因,某些请求比其他请求花费的时间更长)。 关于此类事情的最佳实践的任何提示?

那么结果可以以任何未定义的顺序返回,它们是异步的并且受到互联网和服务器的变幻莫测的影响。

您可以做的是以与TCP相同的方式处理问题。 您使用序列标识符。

保持序列标识符的运行,并在每次发出请求时递增它。 当请求返回时,请按顺序检查它们,并仅在它们进入时处理它们。按顺序保留一个返回的数据列表,并在每次更新后检查该列表。 当第一个预期值出现时,它应该将整个列表处理到第一个间隙。

请记住,您可能会丢失请求,因此在忽略给定序列标识符之前,合适的超时将是有序的。

答案最终成为一个名为ajaxManager的jQuery插件。 这完全符合我的需要:

https://github.com/aFarkas/Ajaxmanager

您可以将所有成功结果对象发送到队列。 拥有与原始请求一起发送的索引,并不断检查该队列是否存在下一个索引。

但是通常浏览器只允许两个同时的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 

我将在黑暗中用这一个刺,但它可能会有所帮助。 也许您可以创建一个全局缓冲区数组,然后每当AJAX返回时,您都可以将结果添加到缓冲区。 然后,您可以设置一个计时器,当触发时,将检查缓冲区的内容。 如果它们是有序的,它将相应地输出它。