为了账号安全,请及时绑定邮箱和手机立即绑定

等待所有诺言解决

等待所有诺言解决

蝴蝶刀刀 2019-11-12 12:47:48
因此,我遇到了多个未知长度的promise链的情况。我希望在处理所有链条后执行一些操作。那有可能吗?这是一个例子:app.controller('MainCtrl', function($scope, $q, $timeout) {    var one = $q.defer();    var two = $q.defer();    var three = $q.defer();    var all = $q.all([one.promise, two.promise, three.promise]);    all.then(allSuccess);    function success(data) {        console.log(data);        return data + "Chained";    }    function allSuccess(){        console.log("ALL PROMISES RESOLVED")    }    one.promise.then(success).then(success);    two.promise.then(success);    three.promise.then(success).then(success).then(success);    $timeout(function () {        one.resolve("one done");    }, Math.random() * 1000);    $timeout(function () {        two.resolve("two done");    }, Math.random() * 1000);    $timeout(function () {        three.resolve("three done");    }, Math.random() * 1000);});在此示例中,我设置了$q.all()承诺1,,2和3,这些承诺会在某个随机时间得到解决。然后,我将诺言添加到第一和第三的结尾。我想all在所有链条都解决后解决。这是运行此代码时的输出:one done one doneChainedtwo donethree doneALL PROMISES RESOLVEDthree doneChainedthree doneChainedChained 有没有办法等待连锁解决?
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

当所有链条都解决后,我希望所有人解决。


当然,然后将每个链的承诺传递给all()而不是最初的承诺:


$q.all([one.promise, two.promise, three.promise]).then(function() {

    console.log("ALL INITIAL PROMISES RESOLVED");

});


var onechain   = one.promise.then(success).then(success),

    twochain   = two.promise.then(success),

    threechain = three.promise.then(success).then(success).then(success);


$q.all([onechain, twochain, threechain]).then(function() {

    console.log("ALL PROMISES RESOLVED");

});


查看完整回答
反对 回复 2019-11-12
?
慕容森

TA贡献1853条经验 获得超18个赞

最近出现了这个问题,但是承诺数量未知。使用jQuery.map()解决了。


function methodThatChainsPromises(args) {


    //var args = [

    //    'myArg1',

    //    'myArg2',

    //    'myArg3',

    //];


    var deferred = $q.defer();

    var chain = args.map(methodThatTakeArgAndReturnsPromise);


    $q.all(chain)

    .then(function () {

        $log.debug('All promises have been resolved.');

        deferred.resolve();

    })

    .catch(function () {

        $log.debug('One or more promises failed.');

        deferred.reject();

    });


    return deferred.promise;

}


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 637 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信