JavaScript:链接了多个 promise 对象

JavaScript: Multiple promise objects being chained

工具:ES6 JavaScript

也许这都是肉汁。我只需要一个快速的同行评审来确保我没有做(某事 ugly/sinning)。

我从不同的模块中获取承诺,然后将它们链接起来。我找不到 链接多个 promise 对象的好例子(不要与使用顺序回调链接 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!
}

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 并不意味着您也不能单独处理每个 Promises。

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

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

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

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