如何在jquery 1.5中管理ajax请求的队列?

时间:2011-03-15 20:19:03

标签: javascript jquery queue jquery-1.5 jquery-deferred

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

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

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

  

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

在“并行模式”中有两个请求我想要这个结果:

  

RequestA - > RequestB(ResponseA,响应B在准备好时处理) - > EndOfQueue

在任何一种情况下,如果任何请求失败,我希望队列停止并将控制传递给失败函数。

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

我已经构建了执行“并行”情况的测试用例,并在所有成功完成后调用了when()函数,但这些测试在队列长度上不是动态的,并且不能移植到串行模型。

我可以看到如何创建一个自定义队列对象来处理这个问题,但似乎所有的部分都已经在jquery(?)中为我编写了。我看过了,但没有找到以这种方式涵盖顺序请求的示例。

有关如何使用jquery队列/延迟功能处理此问题的任何想法?

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分:1)

请参阅我提出的两个问题

  1. jQuery Deferred not working
  2. jQuery.when understanding
  3. 希望你能够理解这个概念。

答案 2 :(得分:0)

从延迟的AJAX函数

中查看关于.when()方法的comment