我有一个div的jQuery集合。对于每个div我必须做两个ajax调用,而第一个调用返回一个由第二个调用使用的id。所有的Ajax调用都需要一些时间(比如说一秒钟)。定义几个Ajax调用的顺序
如果我做这样的事情:
$divs.each(function(index, element) {
$.get('/some/url').done(function (id) {
$.post('/some/other/url?id=' + id).done(function() {
$(element).doSomething();
});
})
});
那么所有得到通话将首先完成,然后将所有后电话。但这并不是错误的,我希望尽早执行呼叫,以便尽早向用户显示第一个结果。
所以我不想:
get, get, get, get, get, get, get, get, post, post, post, post, post, post, ...
,而这一点:
get, get, get, get, get, post, get, post, get, post, get, post, get, post, ...
换句话说,只要对一个div第一次调用完成后,立即开始第二个电话。不要等到所有的第一个电话完成。
我想我必须排队打电话。我一定要吗?或者我怎么能做到这一点?
注意:浏览器只能并行执行有限数量的ajax调用。 Firefox中的AFAIK 6默认(Connections per Hostname)。$.get()
调用可能很快,但连接限制会导致提取可能需要一些时间。 6个队列会有帮助吗?或者我应该为每个div有一个队列?
一个额外的任务将是取消整个处理,如果这也是可能的。
更新/解决方案:人们不明白我的问题是什么。正如一些人现在所建议的,我已经使用了priorityQueue in async库。有了这个,我可以减少未决连接的数量并控制请求的顺序。
如果按照现在的方式进行操作,它确实是最快的。 (除非你能够将它们全部合并为一个)。否则,如果延迟了任何获取请求,用户将总体上必须等待更长的时间才能完成。 –
@KevinB你是这么认为的吗?我看到整个处理时间不会改变。这只是一种重新排序,因此可以提前显示一些结果。 – robsch
Gotcha。重新排序会使整体花费更长的时间,但由于前面提出了一些结果,因此会被认为更快。我建议先取第一个,比如说3,然后取其余的。 –