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

时间:2010-12-06 21:48:37

标签: ajax jquery

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

4 个答案:

答案 0 :(得分:8)

结果可以以任何未定义的顺序返回,它们是异步的,受制于互联网和服务器的变幻莫测。

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

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

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

答案 1 :(得分:4)

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

https://github.com/aFarkas/Ajaxmanager

答案 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返回时你都可以将结果添加到缓冲区。然后,您可以设置一个计时器,当触发时,将检查缓冲区的内容。如果它们是有序的,它将相应地输出它。