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

Combine multiple jQuery Deferred objects into a new Deferred object

代码如下: 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中,您可以使用$.when()将多个承诺合并为一个。

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

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

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

相当老的问题,但我花了一些时间找到要组合的 deffereds/promises 个动态数字的答案:

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