【问题标题】:How to handle several ajax requests?如何处理多个ajax请求?
【发布时间】:2013-01-31 19:22:51
【问题描述】:

我的脚本需要处理多个 ajax 请求。这是一个简化的版本:

function request(variable){
    $.ajax({
        // call config
    }).done(function(data){
        // treatment of returned data
        // returning TRUE (ok) or FALSE (errors)
    }).fail(function(e){
        // generating error message
    });
}

我需要打几个电话:

request(variableA);
request(variableB);
request(variableC);

请求同时执行并且运行良好,但我不知道该过程何时完成。而且我无法显示返回值。

一些讨论建议使用 when()。

  $.when(request(variableA), request(variableB), request(variableC))
   .done(function(resultA, resultB, resultC) { 
         alert("Finished!");
         //results available
    });

使用此代码,警报似乎在流程的最开始执行,而不是等待完成...

什么是我最好的选择?

【问题讨论】:

    标签: jquery ajax callback jquery-deferred


    【解决方案1】:

    更改request 以返回承诺

    function request(variable){
        return $.ajax({
            // call config
        }).done(function(data){
            // treatment of returned data
            // returning TRUE (ok) or FALSE (errors)
        }).fail(function(e){
            // generating error message
        });
    }
    

    【讨论】:

    • 澄清一下,这样做会让你使用$.when的代码正常工作:)
    【解决方案2】:

    那些 request() 调用无论如何都会立即返回,因为它们是 ASYNCHRONOUS (因此 AJAX 中的 A)。要将请求链接在一起并仅在它们全部完成后才执行某些操作,您必须让各个 ajax 调用的成功处理程序增加一个计数器,然后仅在计数器达到某个点时才调用“继续”代码。例如

    var alert_counter = 0;
    function request('blahblah', alert_when_reached) {
    $.ajax({
         success: function() { 
            alert_counter++;
            if(alert_when_reached >= alert_counter) {
               proceed_onwards();
            }
         });
    

    并不是说这会按原样工作,而是应该给你这个想法。如果您需要调用 3 个并行请求,则将 3 传递给每个请求,当第三个结果最终出现时,成功处理程序的特定实例将调用任何让您的代码继续执行的函数。

    一些小的改进是为成功处理程序定义一个闭包并将其传递给 request() 函数,因此您没有硬编码的“proceed”函数调用,但这超出了此答案的范围.

    【讨论】:

    • 感谢您的回答。确实,我正在转向反解决方案,因为我无法理解延迟对象,而您的解决方案在这种情况下是有效的。但是,我更喜欢使用 Musa 的选项;使用 jQuery 更轻更优化。
    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2013-01-12
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多