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秒后)。
我有一个简单的回调示例(更像是伪代码),其中根据第一个函数参数对值求和或相乘。
这不像现实生活中的例子。想象一下函数内部的 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秒后)。