Combine multiple jQuery Deferred objects into a new Deferred object

荒凉一梦 提交于 2020-05-29 07:31:30

问题


here's the code: http://jsbin.com/lizami/edit?js,console

Paste the code here as well:

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

What I want is to start two new deferred: bbb and ccc when aaa is resolved. And when both bbb and ccc are resolved. call ddd with the resolved data of bbb and ccc.

Is it possible? The jsbin doesn't work


回答1:


In jQuery, you can use $.when() to combine multiple promises into one.

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

This will wait for aaa to resolve, then it will run both bbb() and ccc() and when they both resolve, it will then call ddd().

Working demo: http://jsfiddle.net/jfriend00/2f7btsq7/




回答2:


Rather old question but it took me some time to find an answer for a dynamic number of deffereds/promises that are to be combined:

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

In the context of the OP's question:

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


来源:https://stackoverflow.com/questions/33060171/combine-multiple-jquery-deferred-objects-into-a-new-deferred-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!