将多个jQuery Deferred对象组合到一个新的Deferred对象中

时间:2015-10-10 23:48:38

标签: jquery jquery-deferred

这里是代码: 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");

我想要的是在解决bbb时开始两个新的延迟:cccaaa。当bbbccc都得到解决时。使用已解析的dddbbb数据调用ccc

有可能吗? jsbin没有工作

2 个答案:

答案 0 :(得分:2)

在jQuery中,您可以使用$.when()将多个promises组合成一个。

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

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

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

答案 1 :(得分:0)

这是一个比较老的问题,但是我花了一些时间才能找到要合并的动态递延/承诺数量的答案:

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));