【问题标题】:Combine multiple jQuery Deferred objects into a new Deferred object将多个 jQuery Deferred 对象组合成一个新的 Deferred 对象
【发布时间】:2016-01-08 16:41:20
【问题描述】:

代码如下: http://jsbin.com/lizami/edit?js,console

在此处也粘贴代码:

var aaa = $.Deferred();

var bbb = function(data){

    console.log(data);

    var dfd = $.Deferred();
    setTimeout(function(){
        dfd.resolve("bbb is done");
    }, 1000);
    return dfd.promise();
};

var ccc = function(data){
    console.log(data);

    var dfd = $.Deferred();
    setTimeout(function(){
        dfd.resolve("ccc is done");
    }, 1000);
    return dfd.promise();
};

var ddd = function(data){
    console.log(data);

    return data;
};



aaa.then([bbb,ccc]).then(ddd);
aaa.resolve("aaa is done");

我想要的是在解决aaa 时启动两个新的延迟:bbbccc。当bbbccc 都被解决时。使用bbbccc的解析数据调用ddd

有可能吗? jsbin 不工作

【问题讨论】:

    标签: jquery jquery-deferred


    【解决方案1】:

    在 jQuery 中,您可以使用 $.when() 将多个 Promise 合并为一个。

    aaa.then(function() {
        return $.when(bbb(), ccc());
    }).then(ddd);
    

    这将等待aaa 解决,然后它会同时运行bbb()ccc(),当它们都解决时,它会调用ddd()

    工作演示:http://jsfiddle.net/jfriend00/2f7btsq7/

    【讨论】:

      【解决方案2】:

      相当老的问题,但我花了一些时间来找到要组合的动态数量的延迟/承诺的答案:

      const promises = [];
      promises.push($.Deferred());
      ...
      promises.push($.Deferred());
      // execute $.when using Function.apply to pass the array of promises as arg
      $.when.apply(null, promises).done(function() {
        // executed after all promises are "done"
      });
      

      在 OP 问题的上下文中:

      aaa.then(function() { return $.when.apply(null, [bbb(), ccc()] }).done(ddd));
      

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        • 1970-01-01
        • 2012-06-06
        • 2012-03-11
        • 2015-06-19
        • 1970-01-01
        相关资源
        最近更新 更多