JavaScript:链接多个承诺对象

时间:2015-10-08 16:57:13

标签: javascript callback promise ecmascript-6

工具:ES6 JavaScript

也许这都是肉汁。我只需要快速的同行评审,以确保我没有做(丑陋/犯罪)。

我抓住来自不同模块的承诺,然后将它们链接起来。我找不到链接多个promise对象的好例子(不要混淆链接序列回调的承诺)因此语法让我困惑,因为我不确定是否我开始在语法上嵌套承诺。

我觉得promise.all应该在混合中,但是因为我有一些函数(如果你愿意回调)来定义成功和失败操作在中间分层 - 使用promise.all语法上令人困惑。 /强>

例如,让我们获得2个承诺。我们完成第一,然后打电话给第二。如果它们都成功 - 执行一些成功操作,否则执行失败操作,最后使用成功或失败对象进行自动完成回调:

bootStrapProgram = function(callback){

    var promise1 = module1.getPromise1();
    var promise2 = module2.getPromise2();

      promise1.then(promise2.then(successOperation,failureOperation).then(callback));

}

successOperation = function(){
  //Shoot out confetti or something I don't care.
}

failureOperation = function(){
 //I dunno, Fire Le Missles!
}

2 个答案:

答案 0 :(得分:4)

如果您只是想知道两个操作何时完成,那么您可以这样做:

var promise1 = module1.getPromise1();
var promise2 = module2.getPromise2();
Promise.all(promise1, promise2).then(function() {
    // success here
}, function(reason) {
    // error here
});

如果你想在另一个之前运行一个操作,那么你可以像这样序列化它们:

module1.getPromise1().then(function(value1) {
    return module2.getPromise2();
}).then(function(value2) {
    // success here
}, function(reason) {
    // error here
});

答案 1 :(得分:1)

Promise.all不一定在语法上容易混淆,你可能正在做的事情。您的代码建议必须按照时间顺序处理promise1和promise2,这不一定是真的。

var promise1 = foo.get(), promise2 = bar.get();

promise1.catch(failure1Fn);
promise2.catch(failure2Fn);

Promise
    .all([promise1, promise2])
    .then(bothSucceededFn);

现在你保持单独的错误处理,但处理了所有成功的案例。不要忘记,仅仅因为你在一系列Promises上调用Promise.all并不意味着你也不能单独处理每一个。

如果你真的不需要单独的错误处理,那么只需

Promise
    .all([promise1, promise2])
    .then(bothSucceededFn)
    .catch(failureFn);