【问题标题】:passing a function which makes ajax requests to $.when .done传递一个向 $.when .done 发出 ajax 请求的函数
【发布时间】:2012-02-08 15:21:56
【问题描述】:

我想即时生成 ajax 请求,但我想确保在它们全部完成后得到回调,所以我想将它们包装在 .when .done 语句中,如下所示:

$.when(function(){
        $.each(oOptions, function(){
            var filePath = this.filePath,
            dataType = this.dataType;

            $.ajax({
                url : filePath,
                dataType : dataType
            });
        });
    })
    .done(function(){
        console.log('success');

        console.log(arguments);
    })
    .fail(function(){
        console.log('failed');
    });

我的选项是一个对象数组,其中包含我想同时发出的每个 ajax 请求的文件路径和数据类型。此代码将返回成功,但参数只是一个函数,ajax 请求永远不会通过。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: javascript jquery ajax function deferred


    【解决方案1】:

    您将一个函数传递给$.when,而您应该传递一个或多个Deferreds。你可以用 deferreds 填充一个数组并将其作为参数传递给$.when

    var deferreds = [];
    
    $.each(oOptions, function() {
        var filePath = this.filePath,
        dataType = this.dataType;
    
        deferreds.push($.ajax({
            url : filePath,
            dataType : dataType
        }));
    });
    
    // use the array elements as arguments using apply
    $.when.apply($, deferreds)
    .done(function(){
        console.log('success');
    
        console.log(arguments);
    })
    .fail(function(){
        console.log('failed');
    });
    

    【讨论】:

      【解决方案2】:

      您不必将“完成”逻辑作为成功函数放入 $.ajax 调用参数中吗?我的意思是这样的:

      $.ajax({
        url : filePath,
        dataType : dataType,
        success: function(){
          console.log('success');
        }
      });
      

      由于 ajax 调用是异步进行的,所以可以在 ajax 调用完成之前调用 done()...

      【讨论】:

      • .when .done 的一点是允许回调所有 ajax 请求
      猜你喜欢
      • 2019-01-26
      • 2017-04-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多