将多个jQuery延迟对象合并为新的延迟对象

问题描述 投票:3回答:2

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

我想启动两个新的递延时间:bbbccc,当aaa解析后。并且当bbbccc都被解析时。使用dddbbb的解析数据调用ccc

有可能吗? jsbin不起作用

jquery jquery-deferred
2个回答
3
投票

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

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

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

正在运行的演示:http://jsfiddle.net/jfriend00/2f7btsq7/


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));
© www.soinside.com 2019 - 2024. All rights reserved.