最早,promise是在社区提出和实现的,后来es6就将其写进了语言标准,统一了用法。所以大家有兴趣可以尝试自己内部实现一个promise构造函数加深对此api的理解。
首先promise内部有3种状态,pending,fulfilled,rejected,一开始是pending,当异步程序有结果时就会转化成成功或者失败,当状态改变,再次调用promise方法时,就会直接输出上次的结果。
promise有3个方法,then,catch,finally,then方法用来接收成功回调,内部实现了链式调用,可return 回一个值,被下一个then方法接收到,then
方法可以接受两个回调函数作为参数,第一个参数是成功回调,第二个是失败回调。catch方法接收错误回调,没有实现链式调用,只执行一次。finally方法,无论失败成功都会执行这个方法,回调函数不接受任何参数。
当Apromise 返回Bpromise对象时,要求是B的异步函数要比A慢,最后状态由A.B共同控制,除非双成功,是成功,其他情况都是失败。
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch
语句捕获。catch能捕获到then方法里面的错误。
构造函数自带的方法:
A:all(),接收一系列的promise对象,只有都成功时才返回true,其他都是false。如传进来的不是promise对象,会调用promise.resolve()方法,将其转为promise对象。如果作为参数的 Promise 实例,自己定义了catch
方法,那么它一旦被rejected
,并不会触发Promise.all()
的catch
方法。意思是说,自己定义了catch方法,会导致all()方法的catch捕获不到而执行then方法。
B:race()方法,和all方法相反,有一个为真就返回结果。
C:resolve():将现有对象转为 Promise 对象:分4种情况
1:接收另一个promise对象,返回其本身。
2参数是一个带有then()方法的对象:将这个对象转为 Promise 对象,然后就立即执行thenable
对象的then
方法。
3参数不是带有then方法的对象,则会马上执行并且返回该值。
4没有任何参数:直接返回一个resolved
状态的 Promise 对象。
立即resolve
的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。因为执行的是then方法。
5Promise.try:用来接收promise操作发生的错误,Node进程中也有‘rejectionHandled’事件来接收promise传出来的错误