【问题标题】:Trying to use deferred objects and $.when to make multiple AJAX calls尝试使用延迟对象和 $.when 进行多个 AJAX 调用
【发布时间】:2017-02-26 16:50:35
【问题描述】:

因此,基于 Medium (https://medium.com/coding-design/writing-better-ajax-8ee4a7fb95f#.d7ymg99mp) 上的本教程,我尝试使用延迟数组、ajax 请求和 jQuery.when 方法来发出多个 ajax 请求并从每个请求中获取结果。

这是我正在做的代码

function updateAllGoingButtons(){
    var dataToPass = {};
    var deferreds = [];

    $('.btn-group').find('button').each(function(){
       console.log($(this).attr('id'));
       dataToPass.button = $(this).attr('id');
       var ajax = $.ajax({
          url: '/update-buttons',
          method: 'post',
          data: dataToPass,
          dataType:'json'
       });

       deferreds.push(ajax);

       $.when.apply($, deferreds).then(function(){

       });
    });
}

我对如何使用这个 $.when 函数以及在哪里可以访问返回给 ajax 调用的数据感到困惑。

我尝试插入一个简单的成功选项,但没有进入它的回调函数。我该怎么做呢?

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    你打电话给when 太早了。 each 循环之外进行操作,在您启动所有 ajax 调用并在数组中获得它们的 promise 之后:

    function updateAllGoingButtons(){
        var dataToPass = {};
        var deferreds = [];
    
        $('.btn-group').find('button').each(function(){
           console.log($(this).attr('id'));
           dataToPass.button = $(this).attr('id');
           var ajax = $.ajax({
              url: '/update-buttons',
              method: 'post',
              data: dataToPass,
              dataType:'json'
           });
    
           deferreds.push(ajax);
    
        });
    
        $.when.apply($, deferreds).then(function(){     // <=== Moved this
                                                        // <===
        });                                             // <===
    }
    

    这些 ajax 调用的结果将作为一系列离散参数提供给您的 then 函数。每个参数将是一个包含三个条目的数组,对应于通常传递给success 函数的三个参数。由于您正在处理一个数组,您可能希望通过arguments 伪数组访问它们。拥有一个拒绝处理程序也是一个好主意(then 的第二个参数,或者在最新版本的 jQuery 中使用 catch):

    $.when.apply($, deferreds).then(
        function() {
            var n;
            for (n = 0; n < arguments.length; ++n) {
                 console.log("Result " + n, arguments[n][0]);
            }
        },
        function() {
            // At least one request failed
        }
    );
    

    【讨论】:

    • 好的,但我仍然不知道如何访问从 $.when 方法内部传递回 AJAX 调用的数据!我怎么做?当我尝试从该方法内部 console.log(deferreds) 时,我没有得到任何输出。
    • @ZaidHumayun:正如when documentation 中所说:“传递给 doneCallbacks 的参数为每个 Deferreds 提供解析值,并匹配 Deferreds 传递给 jQuery 的顺序.when()."(后面是一个示例;在该页面上搜索“pizza”)。基本上:结果是回调的离散参数。
    • 好吧,我似乎误解了这一点。在文档中,看起来 Deferred 对象正在被显式解析,而我只是使用 res.send 来返回数据。我的案子还能用吗?因为我尝试在 then 回调中传递参数并记录它们,但没有运气。 $.when.apply($, deferreds).then(function(a,b,c,d,e) { console.log(a); console.log(b); console.log(c); console.log(d); });
    • @ZaidHumayun:是的。在该示例中,他们正在创建和解决延迟,但在您的用例中,您使用的是由 ajax 创建和解决的。
    • @ZaidHumayun:是的,如果调用全部成功,您应该从这些 console.log 语句中看到一些内容;我愿意:jsfiddle.net/57z7qycL 听起来至少在一次通话中发生了错误。由于您没有将第二个函数传递给then,因此您不会收到错误通知。请注意,对于 ajax,每个结果都是一个包含三个条目的数组(对应于 success 通常会得到的三个参数,因此您通常需要 [0])。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多