由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被扔进了异步队列里。
查看评论