Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多个jQuery延迟对象组合成一个新的延迟对象_Jquery_Jquery Deferred - Fatal编程技术网

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

将多个jQuery延迟对象组合成一个新的延迟对象,jquery,jquery-deferred,Jquery,Jquery Deferred,代码如下: 将代码也粘贴到此处: 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(da

代码如下:

将代码也粘贴到此处:

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
解决后启动两个新的延迟:
bbb
ccc
。当
bbb
ccc
都被解析时。使用
bbb
ccc
的解析数据调用
ddd


可能吗?jsbin不起作用

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

aaa.then(function() {
    return $.when(bbb(), ccc());
}).then(ddd);
这将等待
aaa
解析,然后它将同时运行
bbb()
ccc()
,当它们解析时,它将调用
ddd()


工作演示:

这是一个很老的问题,但我花了一些时间才找到了一个答案,来回答将要组合的动态数量的不同/承诺:

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