工具: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!
}
答案 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);