首页 > 解决方案 > 简单的回调到 Promise 转换

问题描述

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

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 以类似的方式对其进行重构,如果可以做到,是否可以做得更简单。

标签: javascriptcallbackes6-promise

解决方案


您可以将函数转换为异步函数/承诺。
可以在这里找到一些很好的文档 。

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

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

您可以看到最后执行了“延迟求和”(3 秒后)。


推荐阅读