2011-03-15 61 views
6

我一直在jQuery 1.5中测试新的延迟AJAX函数,并且对它们的简单性和功能印象深刻。我有一个更大的问题与排队这些请求的最佳方式有关。如何在jQuery 1.5中管理ajax请求的队列?

我有两种情况:串行和并行,如果你愿意的话。我想避免同步/异步条款,因为我确实希望所有这些都是异步请求,以便用户可以在等待队列进行处理时执行其他操作。然后我想在队列完成处理时调用一个函数。

在具有两个请求我希望如下它们处理过的 “串行模式”:

RequestA - > ResponseA - > RequestB - > ResponseB - > EndOfQueue

在 “并联模式”有两个请求我想这样的结果:

RequestA - > RequestB(ResponseA,ResponseB处理每当准备好) - > EndOfQueue

在这两种情况下,如果任何请求失败,我想队列停止并通过控制失效功能。

我有要求,指定一个动态的队列长度,所以我不认为我可以只将一堆.then()或.when()延迟在一起,因为我不知道它是否是一个或一百个项目。我通过供应商的API在服务器上执行业务逻辑,因此服务器端批处理将很困难,因为我无法控制该代码。

我已经建立测试用例执行“平行”的情况下,并调用()函数时毕竟已经成功完成,但这些测试是不是在队列长度动态的,是无法移植到串行模式。

我可以看到我怎么能创建一个自定义队列对象来处理这个问题,但似乎一切对我来说jQuery中已经写的部分(?)。我看了,但还没有找到一个以这种方式覆盖顺序请求的例子。

有关如何使用jQuery的队列/延迟的功能处理这个有什么想法?

回答

4

实现你RequestA最简单的方法 - > ResponseA - > RequestB - > ResponseB为了将使用这样的事:

var queue = []; 

function qNext() { 
    $.ajax(queue.shift()).success(qNext); 
} 

function qAjax(options) { 
    queue.push(options); 
} 

qAjax({ 
    // $.ajax options 
}); 

qAjax({ 
    // $.ajax options 
}); 

qNext(); 

请参阅DEMO

这是你的需求的略微简化的版本,但它很容易添加一个回调运行后队列为空。

你确定你不想RequestA的顺序 - > RequestB - > ResponseA - > ResponseB?

+0

谢谢!我会给这个镜头。在这个应用程序中,我们需要确保请求B在接收到响应A之前未启动,因为通常依赖于B的指令中A的结果。 – Graham 2011-03-15 21:08:40

+0

@Graham:观看Pedro Teixeira的[Asynchronous Iteration Patterns](http://nodetuts.com/tutorials/19-asynchronous-iteration-patterns.html)教程。他谈论Node.js,但这些模式可以用于任何JavaScript代码。我想你可能会发现一些有用的技巧,可以帮助你做你想做的事情。当我写我的答案时,我完全忘了它。 – rsp 2011-03-15 21:20:48

+0

非常有趣,再次感谢您的链接。我得到了一些关于如何构建自定义ajax队列对象的好主意。 – Graham 2011-03-15 21:42:14

0

看到这个comment上。当()方法递延AJAX功能

+0

是的,我实际上使用这个例子来设置我的测试用例在when()之前。我的问题是关于如何使用动态数量的ajax请求。谢谢! – Graham 2011-03-15 20:30:57

+0

mmm ...我虽然应用,但无法找到一种方法来传递函数执行语句作为参数。如果有这种方式,它会看起来像'$ .when.apply(jQuery,array_of_ajax_requests_queue);'。问题是array_of_ajax_requests_queue必须像'[func1(),func2()]' – 2011-03-15 20:47:35

+0

我遇到的问题不是在when()中,而是在更多的如何启动队列和处理它。 – Graham 2011-03-15 20:56:11