Promise
定义(取自MDN)
一个
Promise
对象代表一个在这个 promise 被创建出来时不一定已知的值。它让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。 这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。
简单来说就是Promise内部有三个状态,核心原理就是通过内部状态机利用状态和回调实现了异步功能。
一个Promise必然处于以下三种状态之一:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
Promise支持链式调用
1 | const myPromise = |
Generator
生成器对象是由一个 generator function 返回的,并且它符合可迭代协议和迭代器协议。
1 | function* gen() { |
归属于ES6规范。其最大的作用就是暂停执行,借助于这个特性,就可以将异步写法改为同步写法。只需要yield Promise就可以实现同步写法。
async函数
async函数是使用async
关键字声明的函数。 async函数是AsyncFunction
构造函数的实例, 并且其中允许使用await
关键字。async
和await
关键字让我们可以用一种更简洁的方式写出基于Promise
的异步行为,而无需刻意地链式调用promise
。
1 | async function name([param[, param[, ... param]]]) { |
归属于ES7规范。
其实质是Generator和Promise的语法糖,就是一个可以自行执行的generator 包裹了 一些Promise。
优雅处理async/await错误
方法一
1 | /** |
用法:
1 | const handleLogin = async () => { |
优点:
- 不用写大量不优雅的try/catch 语句
- 遇到异常可以当场停止,而不是 await().catch((e) ⇒ {})这种去处理。若用catch去捕捉,那么catch里面是异步的,不会终止当前异常代码的执行。
缺点:
- 缺点就是所有的异步函数都要用这个封装方法去包裹执行
参考资料
MDN,原来好多别人说起来很厉害的东西,MDN上面都有文档。
async/await 你是会用,但是你知道怎么处理错误吗?