6

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

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

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

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

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

RequestA -> RequestB (ResponseA, ResponseB 准备就绪时处理) -> EndOfQueue

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

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

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

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

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

4

3 回答 3

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();

演示

这是您的要求的稍微简化的版本,但是在队列为空后添加回调以运行会很容易。

您确定不想要 RequestA -> RequestB -> ResponseA -> ResponseB 的顺序吗?

于 2011-03-15T21:07:48.603 回答
1

请参考我问的两个问题

  1. jQuery延迟不起作用
  2. jQuery.when 理解

希望您应该能够理解这个概念。

于 2011-03-17T09:21:47.920 回答
0

请参阅延迟 AJAX 函数中关于 .when() 方法的评论

于 2011-03-15T20:23:21.533 回答