javascript - 执行异步函数列表
问题描述
我有一个练习来制作一个函数,该函数executeFunctions
将异步函数列表和参数(例如数字)作为参数。函数必须一个接一个地发生,所以如果fun1
结束,fun2
需要从返回的值开始fun1
。问题是我不能使用async
and await
。我想用 来做reduce
,但我猜它想const res1
在返回值之前执行并走得更远(因为setTimeout
)。async
没有and有没有办法做到这一点await
?
const fun1 = function(value) {
return setTimeout(() => value*2, 3000)
}
const fun2 = function(value) {
return setTimeout(() => value*4, 3000)
}
const cb2 = (value) => {
return value*10
}
const executeFunctions = (funTab, cb) => (n) => {
const res1= funTab[0](n)
console.log(res1)
const resReduce = funTab.reduce((prev,curr) => {
const res2 = curr(prev)
return prev+res2
}, res1)
return cb(resReduce)
};
executeFunctions([fun1,fun2], cb2)(2)
解决方案
我们可以使用 Promise-chaining:
const fun1 = function(value) {
return Promise.resolve(value * 2);
}
const fun2 = function(value) {
return Promise.resolve(value * 2);
}
const fun3 = function(value) {
return Promise.resolve(value * 2);
}
const executeFunctions = (funcList) => (n) => {
let chain = Promise.resolve(n); // initial value
for (let i = 0; i < funcList.length; i++) {
chain = chain.then(funcList[i]); // keep chaining
}
return chain; // last promise
};
const main = () => {
// we need to wait for the last promise in order to print the result
executeFunctions([fun1, fun2, fun3])(2).then(x => console.log('solution is:', x));
}
main() // prints: "solution is: 16"
或者,我们也可以使用建议的 reduce 解决方案的修改版本,通过executeFunctions
如下更改实现(其余代码应保持与之前的代码片段相同):
const executeFunctions = (funcList) => (n) => {
const init = Promise.resolve(n);
const res = funcList.reduce((p, c) => {
return p.then(c)
}, init);
return res;
};
推荐阅读
- r - 用于在列中查找唯一且不同的值的 R 函数是什么?
- javascript - cpu激烈的js动画,会不会是setInterval?
- angular-cli - Angular ivy i18n 提取“缺少延迟加载辅助函数的声明”
- sql - 在执行脚本中使用参数作为日期
- python - 如何在使用 Azure 认知语音翻译 API 时使用 python sdk 识别说话者?
- python - 错误属性错误:“列表”对象没有属性“发送键”
- sql - Azure DB 上的简单 SQL 更新性能不佳
- arrays - `.=` 什么时候比 `=` 更有效?
- http - 使用 wrk 对 nginx 反向代理进行负载测试时如何找出大量非 2xx 或 3xx 响应背后的错误
- firebase - 是否有任何关于开发用户聊天消息屏幕的教程/链接,类似于 AirBnB 或 Instagram 等应用程序?