【发布时间】:2021-05-03 20:49:44
【问题描述】:
代码中使用的变量和函数:
const fakeAPI = (delay, value) =>
new Promise(resolve => setTimeout(() => resolve(value), delay));
const useResult = x => console.log(new Date(), x);
此代码通过使用 reduce() 实现来打印 forEach 不能使用异步调用的内容:
const forEachAsync = (arr, fn) =>
arr.reduce(
(promise, value) => promise.then(() => fn(value)),
Promise.resolve()
);
(async () => {
console.log("START FOREACH VIA REDUCE");
await forEachAsync([1, 2, 3, 4], async n => {
const x = await fakeAPI(n * 1000, n);
useResult(x);
});
console.log("END FOREACH VIA REDUCE");
})();
输出
/*
START FOREACH VIA REDUCE
2019-10-13T20:02:23.437Z 1
2019-10-13T20:02:24.446Z 2
2019-10-13T20:02:25.949Z 3
2019-10-13T20:02:27.952Z 4
END FOREACH VIA REDUCE
*/
主代码块上下文中arr.reduce函数中promise和value参数的作用是什么?
value参数是否传递给async n箭头函数?
尽管,我更喜欢解释,因为我正在研究函数式编程,但是,如果有任何其他方式以 FP 方式处理这个问题,我将不胜感激。
【问题讨论】:
-
@SlavaKnyazev 非常感谢。你对这些问题有什么意见吗?我很想听听。
-
我很难理解你在问什么。您是否正在寻找有关如何枚举异步对象或 reduce 如何工作的说明?
-
基本上,我要问的是自定义forEachAsync函数在第二个代码块中是如何工作的?
-
@afyonkes 你知道
reduce是如何与同步函数一起工作的吗?以及它如何扩展为调用链?
标签: javascript async-await functional-programming emulation reduce