如何链接多个条件承诺?

时间:2016-11-25 11:47:43

标签: javascript promise

在我的代码中,我有条件任务,都返回一个承诺。我需要按顺序运行任务。

我目前的实现看起来像这样:

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电话链更清洁,那么我很乐意看到一个例子。

2 个答案:

答案 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)之外 - 值abc都可用于相同的范围。这意味着您的条件和退货价值可能取决于您的任务的任意组合&#39;承诺的价值观。