【问题标题】:How to manage queues of ajax requests in jquery 1.5?如何在 jquery 1.5 中管理 ajax 请求队列?
【发布时间】:2011-07-16 02:37:16
【问题描述】:

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

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

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

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

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

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

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

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

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

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

关于如何使用 jquery 队列/延迟功能来处理这个问题有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    请参考我问的两个问题

    1. jQuery Deferred not working
    2. jQuery.when understanding

    希望你能理解这个概念。

    【讨论】:

    • 抱歉,您似乎没有理解我要问的问题。
    【解决方案2】:

    实现您的 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 的顺序吗?

    【讨论】:

    • 谢谢!我会试一试。在这个应用程序中,我们需要确保在收到响应 A 之前没有启动请求 B,因为在 B 的指令中通常会依赖 A 的结果。
    • @Graham:观看 Pedro Teixeira 的 Asynchronous Iteration Patterns 教程。他谈到了 Node.js,但这些模式可以在任何 JavaScript 代码中使用。我认为您可能会在那里找到一些有用的技巧,可以帮助您完成您正在尝试做的事情。我在写答案时完全忘记了它。
    • 非常有趣,再次感谢您提供该链接。我得到了一些关于如何构建自定义 ajax 队列对象的好主意。
    【解决方案3】:

    在延迟 AJAX 函数中的 .when() 方法上查看此 comment

    【讨论】:

    • 是的,我实际上使用该示例来设置我之前使用 when() 的测试用例。我的问题是关于如何使用具有动态数量的 ajax 请求的那些。谢谢!
    • 嗯...我虽然关于应用,但找不到将函数执行语句作为参数传递的方法。如果有这种方式,它看起来像$.when.apply(jQuery, array_of_ajax_requests_queue);。问题是 array_of_ajax_requests_queue 必须像 [func1(), func2()]
    • 我遇到的问题不在于 when(),而在于如何启动队列并处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多