由reduce引发的Promise决议思考
十月 06, 2020
本文共计:
785 字
预计阅读时长:
3分钟
reduce
有哪些奇淫巧技
?
- 最基本的累加数
- 数组转对象
- 顺序执行异步任务
本文不再阐述一些比较官方的话语。
最基本的累加
1 | const arr = [1, 2, 3]; |
数组转对象
1 | // 用过 loadsh 的小伙伴都应该知道,lodash 提供了_keyBy 提供了这样的功能 |
顺序执行异步任务
1 | const PromiseTaskA = () => new Promise((resolve) => { setTimeout(() => { |
当到这里的时候,我突然联想到一个问题,Promise.all
是顺序执行的吗?为什么他可以在then
里对应传入异步任务数组返回相应的结果?
1 | const PromiseTaskA = () => new Promise((resolve) => { setTimeout(() => { |
原因很简单,Promise.all
是并行的,也就是宏观意义上的并行,也可以说是同时执行,当哪个异步任务执行结束,就把对应的执行结果塞进数组内部,所以就可以实现结果对应。
Promise.all
并不会顺序执行,请不要依赖Promise.all
去做顺序执行流程任务。
问题又来了?怎么保证
Promise
的执行尽管失败了,但是Promise.all
并不会中断?
其实也很好解决,把异步任务的catch
给resolve出来
,保证整个并行任务流的正常运行。
扩展一个知识点,
Promise
为什么会发生值透传?
1 | Promise.resolve(1) |
原因也很简单,因为Promise
的then
、catch
期望的是一个函数,如果出现!Function
就会发生透传。
继续扩展一个知识点,
Promise
是微任务吗?then
是同步还是异步的。
Promise
构造函数是同步的,then
、catch
也是同步的,但是内部的callback
被扔进了异步队列里。
查看评论