在我的代码中,我有条件任务,都返回一个承诺。我需要按顺序运行任务。
我目前的实现看起来像这样:
var chain = [];
if (/* some condition for task A */) {
chain.push(function(doContinue){
taskA().then(doContinue);
});
}
if (/* some condition for task B */) {
chain.push(function(doContinue){
taskB().then(doContinue);
});
}
if (/* some condition for task C */) {
chain.push(function(doContinue){
taskC().then(doContinue);
});
}
var processChain = function () {
if (chain.length) {
chain.shift()(processChain);
} else {
console.log("all tasks done");
}
};
processChain();
这很好用,但最初我一直在寻找一种方法,只使用Promise创建链,并使用.then
链接所有函数,但我无法获得有效的解决方案。
如果只使用Promise和then
电话链更清洁,那么我很乐意看到一个例子。
答案 0 :(得分:15)
一种可能的方法:
var promiseChain = Promise.resolve();
if (shouldAddA) promiseChain = promiseChain.then(taskA);
if (shouldAddB) promiseChain = promiseChain.then(taskB);
if (shouldAddC) promiseChain = promiseChain.then(taskC);
return promiseChain;
另一个:
return Promise.resolve()
.then(shouldAddA && taskA)
.then(shouldAddB && taskB)
.then(shouldAddC && taskC);
答案 1 :(得分:4)
您可以使用新的async
/ await
语法
async function foo () {
let a = await taskA()
if (a > 5) return a // some condition, value
let b = await taskB()
if (b === 0) return [a,b] // some condition, value
let c = await taskC()
if (c < 0) return "c is negative" // some condition, value
return "otherwise this"
}
foo().then(result => console.log(result))
对此有什么好处 - 除了代码非常平坦且可读(imo)之外 - 值a
,b
和c
都可用于相同的范围。这意味着您的条件和退货价值可能取决于您的任务的任意组合&#39;承诺的价值观。