javascript - 简单的回调到 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 以类似的方式对其进行重构,如果可以做到,是否可以做得更简单。
解决方案
您可以将函数转换为异步函数/承诺。
可以在这里找到一些很好的文档 。
但我想你也想模拟一些延迟。所以我为此添加了额外的功能(它可能有助于理解)。
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 秒后)。
推荐阅读
- javascript - 用变量名声明动态局部变量
- javascript - 将 Node.js 输出传递到 Web 界面
- python-3.x - 每次在字符串中找到特定单词时,Python如何打印字符串?
- ios - 在有限的文本字段长度上剪切粘贴的文本
- java - 请求哪些有效,哪些无效
- entity-framework-core-2.1 - 如何在 EF Core 中多次使用 GroupBy
- python - 为什么我的文本解析不正确?
- python - 熊猫如何根据过去的表现选择股票进行投资(动量、趋势跟踪)
- vba - 运行时错误 1004 使用两个索引/匹配时无法获取匹配属性
- c++ - 如何比较两个经过的时间?