由于JavaScript的单线程处理方式,异步处理一直是JavaScript开发者的痛点。在ES6之后,我们可以使用Promise和Async/Await的方式来更优雅地处理异步请求。
我们在日常开发中,应该会经常使用Promise和Async/Await处理异步请求、异步操作等事情,但是还是会有很多开发者对Promise和Async/Await的原理和具体实现不是很了解,这一块也经常在面试中被问到,要想完整地理解这块内容还是要花一些时间的。
这篇文章从Promise出发,介绍了底层原理和实现,内容有以下几个关键点。
Promise
Promise是一种“仿真”设计,依托现实中的场景,有几种状态:
- pending: 初始化调用一个Promise时,还不确定它最终会是什么状态;
- fulfilled: 表示操作成功完成;
- rejected: 表示操作失败;
Promise中的then函数,是一个非常有意思的设计,它保证了异步流程的迭代执行,且易于拓展和处理。
Async/Await
Async/Await 是基于 Promise 的封装,让Promise的使用更加优雅,却打破了一定要通过then函数才能取到Promise的值的限制。
如果你想对Async/Await了解更多,可以去看下ES6中的Generator function,它是介于Async/Await和Promise之间的一种异步处理方式。
Try, Catch, Finally
在Promise中,我们可以通过catch函数来处理内部异常,但是Async/Await中没有响应的函数来处理异常情况。但这种情况也不是无解,直接上最通用的try/catch就能解决,当然还可以用finally来处理必须执行的流程。
文中内容稍微偏基础,建议阅读以下,强化知识点。
