Promise 转换的简单回调

Simple Callback to Promise Conversion

我有一个简单的回调示例(更像是伪代码),其中根据第一个函数参数对值求和或相乘。
这不像现实生活中的例子。想象一下函数内部的 task/calculation 需要一些时间(例如计算宇宙中恒星的数量)。但是如果我们把这个放在一边,带回调的 pattern/template 看起来像这样:

let sum = function(a, b) {
  return a + b;
}

let mul = function(a, b) {
    return a * b;
}

let dne = function(a, b) {
    return 'it does not exist';
}

let doCalculation = function(route) {
  switch(route) {
      case 'sum':
        return sum;
      case 'mul': 
        return mul
      default: 
        return dne
  }
}

console.log(doCalculation('sum')(3, 4)) //7

是否可以用类似的方式用 Promises 重构,如果可以,是否可以做得更简单。

let sum = function(a, b) {
  return a + b;
};

new Promise(function(resolve, reject) {
  resolve(sum(1, 2));
}).then(function(previousSum) {
  return previousSum + sum(3, 4);
}).then(function(previousSum) {
  document.body.innerHTML = previousSum + sum(5, 6);
});

您可以将函数转换为异步函数 functions/promises。
可以找到一些很好的文档 here .

但我猜你也想模拟一些延迟。所以我为此添加了额外的功能(它可能有助于理解)。

const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))

const sumWithDelay = async (a, b) => {
  console.log("Delay started")
  await sleep(3000)
  console.log("Delay ended")
  return a + b;
}

const sum = async (a, b) => {
  return a + b;
}

const mul = async (a, b) => {
  return a * b;
}

let dne = async function() {
  return 'it does not exist';
};

let doCalculation = function(route) {
  switch (route) {
    case 'sum':
      return sum;
    case 'sumWithDelay':
      return sumWithDelay;
    case 'mul':
      return mul;
    default:
      return dne;
  }
};

doCalculation('sumWithDelay')(2, 2).then(res => console.log(res)); //4
doCalculation('sum')(3, 4).then(res => console.log(res)); // 7
doCalculation('mul')(3, 4).then(res => console.log(res)); // 12
doCalculation('dne')(3, 4).then(res => console.log(res)); // it does not exist

输出将是:
延迟开始
7
12
它不存在
延迟结束
4

可以看到“sum with delay”是最后执行的(3秒后)。