什么是Promise
在js中,很多操作都是异步进行的,例如事件的响应,数据请求等。
通常我们都是以回调函数的方式来写一个异步的方法,例如
1 | fs.readdir(source, function (err, files) { |
我们需要在回调函数中去做一些操作,甚至在操作中还有异步方法,又会多一层回调函数,这样层层嵌套代码就变得十分难读。Promise
就是解决了回调函数带来的嵌套问题。Promise
是一个代理对象,和原先要进行的操作并无关系,
它通过引入一个回调,避免更多回调。
1 | new Promise( |
上面就返回了一个Promise
对象,一个Promise
对象有3个状态
- pending 待定 初始状态
- 调用resolve fulfiled 实现 操作成功
- 调用reject rejected 被否决 操作失败
状态改变就会触发then
里的响应函数 then
之后还可以继续调用then
根据前一个then
的返回值
简单使用
1 | console.log('start') |
这就是Promise
的使用方法,传入一个执行器,通常是个有异步的方法,再一定时间后resolve
或reject
数据,通过then
或者catch
拿到异步返回的数据或异常。
then的返回值
1 | console.log('start') |
then
方法总是返回一个Promise
对象,所以可以链式调用then
方法
then的参数
在上面的代码中,在then
方法中传入了一个函数,用于处理fulfilled
状态Promise
的返回。
其实then
还可以接收第二个参数,也是一个函数,用于处理rejected
状态then
根据前面的Promise
状态选择状态响应函数的执行
在响应函数中,可以返回新的Promise
,下一级的then
会在新的Promise
状态改变后执行;返回其他值,则立刻执行下一级then
错误处理
错误捕获的方式有两种,一是then
方法的第二个参数,二是使用catch
方法捕获错误
推荐使用catch
,更清晰好读catch
也可以返回promise
实例,可以继续调用then
如果在catch
中输出错误,可以被后面的catch
捕获
建议在所有队列后都加上catch
,保证错误能被处理到
静态方法
Promise.resolve
Promise.resolve(xxx)
:参数为空或者非Promise
对象时返回一个状态是fulfilled
的Promise
对象;如果传入Promise
对象,直接返回不做任何处理。
Promise.reject
同上,返回rejected
状态的Promise
Promise.all
Promise.all([])
:传入promise
对象数组,将多个promise
实例包装成一个新的Promise
实例
当所有Promise
都完成,该Promise
完成,返回全部值的数组
有任何一个失败,该Promise
失败,返回值是第一个失败的子promise
Promise.race
Promise.race([])
:返回第一个执行完的结果
应用:把异步操作和定时器放在一起,如果定时器先触发,认为超时