promise 和 async/await
promise
要实现Promise
对象首先我们要了解Promise
拥有哪些特性,简单概括为以下几点
1、Promise
有三种状态:pending
(进行中)、fulfilled
(已成功)、rejected
(已失败)
2、Promise
对象接受一个回调函数作为参数, 该回调函数接受两个参数,分别是成功时的回调resolve
和失败时的回调reject
;另外resolve
的参数除了正常值以外, 还可能是一个Promise
对象的实例;reject
的参数通常是一个Error
对象的实例。
3、then
方法返回一个新的Promise
实例,并接收两个参数onResolved
(fulfilled
状态的回调);onRejected
(rejected
状态的回调,该参数可选)
4、catch
方法返回一个新的Promise
实例
5、finally
方法不管Promise
状态如何都会执行,该方法的回调函数不接受任何参数
6、Promise.all()
方法将多个多个Promise
实例,包装成一个新的Promise
实例,该方法接受一个由Promise
对象
组成的数组作为参数(Promise.all()
方法的参数可以不是数组,但必须具有Iterator
接口,且返回的每个成员都是Promise
实例),注意参数中只要有一个实例触发catch
方法,都会触发Promise.all()
方法返回的新的实例的catch
方法,如果参数中的某个实例本身调用了catch
方法,将不会触发Promise.all()
方法返回的新实例的catch
方法
7、Promise.race()
方法的参数与Promise.all
方法一样,参数中的实例只要有一个率先改变状态就会将该实例的状态传给Promise.race()
方法,并将返回值作为Promise.race()
方法产生的Promise
实例的返回值
8、Promise.resolve()
将现有对象转为Promise
对象,如果该方法的参数为一个Promise
对象,Promise.resolve()
将不做任何处理;如果参数thenable对象(即具有then方法),Promise.resolve()
将该对象转为Promise
对象并立即执行then
方法;如果参数是一个原始值,或者是一个不具有then
方法的对象,则Promise.resolve
方法返回一个新的Promise
对象,状态为fulfilled
,其参数将会作为then
方法中onResolved
回调函数的参数,如果Promise.resolve
方法不带参数,会直接返回一个fulfilled
状态的 Promise
对象。需要注意的是,立即resolve()的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执行,而不是在下一轮“事件循环”的开始时。
- 主要是用来解决异步编程回调地狱的问题
回调地狱
1 | <script> |
Promise基本使用
- Promise就像是一个
先知
,并且它预先设置了成功
和失败
要执行的回调函数成功
和失败
代表Promise的两种状态
- 成功:比如如果后台返回的响应状态码为200并且返回了正确的数据,Promise就把状态改成
成功
,并且执行成功的回调函数 - 失败:比如如果响应状态码500,Promise就把状态改成
失败
,并且执行失败的回调函数
- 通过new实例化Promise
- 参数是一个函数
- 通过then设置成功和失败的回调函数
1 | new Promise((resolve, reject) => { |
async/await
promisegenerator语法糖async作为一个关键字放到函数前面
任何一个 async 函数都会隐式返回一个 promise
await 关键字只能在使用 async 定义的函数中使用
await后面可以直接跟一个 Promise实例对象
await函数不能单独使用
async/await 让异步代码看起来、表现起来更像同步代码
1 | async function queryData() { |
async处理多个异步函数
1 | async function queryData() { |