- Promise对象接受一个函数作为参数,这个函数接受js引擎有的两个函数resolve与reject,作用分别是在Promise状态发生改变时调用,根据从pending到fulfilled或rejected执行不同函数(通过设定条件执行),当状态改变时状态就不能在变化了,注意虽然两个函数虽然都有将Promise状态改为最终已定型状态并将结果或者错误作为参数传递出去的作用,但最好在执行前加上return ,否则两个函数后面的代码还是会正常执行。
- 对于后面数据如果处理放在then()回调函数中,这个是定义在promise.prototype上的,每个promise实例都有这个方法,catch也一样,用于捕获错误,虽然then接受两个参数,分别是resloved和rejected状态的处理函数,但通常不写第二个参数,而捕获错误交给catch,这样可以捕获then回调中可能报出的错误。如果没有用指定错误处理的回调函数,那么promise对象抛出的错误不会退出进程,脚本会继续运行。catch方法返回的还是一个Promise对象,因此还是可以接then。另外catch中还能抛出错误,前一个catch中的错误由后面的catch来捕获。
- finally方法的回调函数不接受任何参数,里面的操作状态无关,不依赖Promise的执行结果,都会执行回调函数,从原理上能看出,finally调用后返回的值就是原来的值。(定义时执行callback后通过then把结果返回了出来)
- Promise.all 是Promise自身的方法,参数接受一个promise组成的数组,
const p=Promise.all([p1,p2,p3]);
p的状态由p1,p2,p3决定,分成两种情况,只有p1,p2,p3的状态都变成fulfilled,p的状态才会变成fulfilled,并传递给P的回调函数,只要有一个被rejected,那么p就会变成rejected,且第一个reject的实例的返回值会传回给P的回调函数。区别在于作为参数的Promise实例有没有自己的catch方法,如果有的话,发生错误的实例(例如p2),p2指向的是catch返回的一个新的promise实例,该实例在执行完catch之后状态也会变resolved,因此如果其他实例没有发生错误或者也有catch方法,那么最后都会resolved,将调用包装后这里也就是p的then中回调函数,因此使用的时候只需要给p一个catch方法即可。 - Promise.race同样接受一个promise实例的数组作为参数,只要有一个状态改变,那么最外面包装的实例状态就会跟着改变,率先改变的实例的返回值传递给p的回调函数。例如其中一个Promise实例可以使用setTImeout函数,在设定的时间内reject出去。如果其他的实例,没有在这个事件内返回值那么就会执行p的catch中的回调函数。有点像xhr的ontimeout事件。
- Promise.resolve将现有对象转化为Promise对象
1.如果参数是一个Promise对象,那么会原封不动,不做修改的返回这个实例
2.如果参数是一个thenable对象,也就是具有then方法的对象,那么会立即把这个对象转为Promise对象,并立即执行其中的then方法
3.参数根本是没有then方法的对象或者根本不是对象,此方法会返回一个新的Promise对象,状态为resolved
4.不带任何参数,直接返回一个resolved状态的Promise实例,需要注意的是Promise.resolve是在本轮事件循环结束时执行,setTimeout是在下一轮事件循环开始时执行,也就是Promise.resolve是在setTimeout之前执行。关于事件队列事件循环 :深入理解 JavaScript 事件循环(一)— event loop 以及 [译] 深入理解 JavaScript 事件循环(二)— task and microtask
网友评论