由于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
来处理必须执行的流程。
文中内容稍微偏基础,建议阅读以下,强化知识点。