Promise
Promise
Promise简介
Promise
有三种状态,Pending
(进行中)、Resolved
(已完成)、Rejected
(已失效)。 Promise
对象的状态改变,只有两种可能:从Pending
变为Resolved
和从Pending
变为Rejected
。
除promise
对象规定的方法(这里的 then
或 catch
)以外的方法都是不可以使用的。
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”(即从Pending
变为Resolved
),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject
同理。
一般对结果进行判断,然后决定是调用哪个函数。
失败的话,会在调用catch
方法后的回调函数。
Promise.prototype.then()
then
方法返回的是一个新的Promise
实例(注意,不是原来那个Promise实例)。因此可以采用链式写法。
前一个then
方法的如果有返回值,会作为下一个then
方法的参数。
使用promise.then(onFulfilled, onRejected)
的话,在 onFulfilled
中发生异常的话,在 onRejected
中是捕获不到这个异常的。
在 promise.then(onFulfilled).catch(onRejected)
的情况下,then
中产生的异常能在 .catch
中捕获。
Promise.prototype.catch
Promise.prototype.catch
方法是.then(null, rejection)
的别名,用于指定发生错误时的回调函数。
如果异步操作抛出错误,状态就会变为Rejected
,就会调用catch
方法指定的回调函数,处理这个错误。
Promise.all()
Promise.all
方法接受一个数组作为参数,p1
、p2
、p3
都是Promise对象的实例。
所有参数的状态都为fulfilled
,p
的状态才会是fulfilled
。 或者其中一个是rejected
,p
的状态就会变成rejected
。
Promise.race()
上面代码中,只要p1
、p2
、p3
之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
如果5秒之内fetch
方法无法返回结果,变量p
的状态就会变为rejected
,从而触发catch
方法指定的回调函数。
Promise.resolve()
Promise.reject()
Promise.reject(reason)
方法也会返回一个新的 Promise
实例,该实例的状态为rejected
。
done()
Promise
对象的最后可以执行一个done
方法,
done
都会捕捉到任何可能出现的错误,并向全局抛出。
finally()
finally
方法用于指定不管Promise
对象最后状态如何,都会执行的操作。它与done
方法的最大区别,它接受一个普通的回调函数作为参数,该函数不管怎样都必须执行。
参考:http://es6.ruanyifeng.com/#docs/promise 、http://liubin.org/promises-book/、[MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise)
Last updated