基本原理
Promise是用来处理异步操作的。主要用途是解决回调地狱。
promise是一个对象,使用它可以获取异步操作的信息。Promise提供统一的API,各种异步操作可以使用同样的方法处理。
原理:
- Promise有三种状态:peding、fulfilled、rejected
- 状态只能从peding->fulfilled或者peding->rejected,且状态一旦改变便不能二次修改
- Promise使用两个函数resolve()、reject()来改变状态
- then接收两个参数,判断状态。如果状态是成功,则调用成功回调函数;如果失败则调用失败回调函数。
用法
- Promise对象是一个构造函数,通过new生成一个Promise实例
- 构造函数接收一个函数作为参数,这个函数有两个参数,分别是resolve,reject;
- resolve函数的作用是将未完成状态变为成功状态。在异步操作成功时调用,并将异步操作的结果作为参数处传出去;reject函数的作用是将未完成状态变为失败状态。在异步操作失败时调用,并将异步操作的结果作为参数传出去。
- Promise实例生成后,可以用then()方法指定resolve和reject这两个状态的回调函数;第一个是成功时调用的,第二个是失败的时候调用的
then()方法返回一个新的Promise实例,如果下面还有then方法,则返回结果作为下一个回调函数的参数
catch()用于指定发生错误的回调函数
如果异步操作发生错误,或者是then方法指定的回调函数运行时发生错误,都会别catch捕获。 一般:不会在then()方法里面定义失败的回调函数,总是用catch方法。
finally()方法,不管最后Promise对象的状态如何,总是执行的操作。不接受任何参数
all() 将多个实例包装成一个新的实例。可以接受一个数组作为参数,并且数组的元素都是Promise的实例
新的Promise实例的状态是由数组中所有的Promise对象的状态决定的。
- 如果数组中所有的Promise对象的状态都是fulfilled,则新实例的状态是fulfilled。此时所有的Promise对象的返回值会组成一个数组传递给新对象的回调函数
- 如果数组中有一个Promise对象的状态是rejected,则新实例的状态是rejected。此时第一个reject的实例返回值将作为参数传递给新Promise的回调函数。
- 注意,如果作为参数的 Promise 实例,自己定义了
catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。
Promise.race()
跟Promise.all()方法很像,如果数组中有一个promise对象率先状态发生改变,那么新的Promise对象的无状态也会发生改变,将率先状态发生改变的Promise对象的返回值作为参数传递给新的Promise对象的回调函数。
Promise.allSettled()方法,用来确定一组异步操作是否都结束了
Promise.allSettled()方法接受一个数组作为参数,数组的每个成员都是一个 Promise 对象,并返回一个新的 Promise 对象。只有等到参数数组的所有 Promise 对象都发生状态变更(不管是fulfilled还是rejected),返回的 Promise 对象才会发生状态变更。
Promise.allSettled()的返回值allSettledPromise,状态只可能变成fulfilled。它的回调函数接收到的参数是数组results。该数组的每个成员都是一个对象,对应传入Promise.allSettled()的数组里面的两个 Promise 对象。
Promise.any()
只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。
跟Promise.race()很像,但是Promise.race()只要有一个对象的状态发生reject的话