是ES6引入的新对象,是异步编程的一种解决方案。主要作用用来解决js异步机制里,回调机制产生的“回调地狱”。
Promise对象是一个构造函数,用来生成Promise实例,构造函数接受一个立即执行函数作为参数,该函数的两个参数分别为resolve和reject,用来改变Promise的状态。
状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态。 状态一旦改变,就不会再变。只有两种可能:从pending变为fulfilled和从pending变为rejected。
无法取消也无法从外部观察到当前Promise的状态
const promise = new Promise(function(resolve, reject) {});
作用: Promise封装了异步回调形式,让异步回调可以写的更加优雅,提高可读性。链式调用减低了编码难度
-
then()
状态发生变化时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数
then返回的是一个新的promise实例,使之可以链式调用
-
catch()
1、可以说是then第二个回调函数(.then(null, rejection)或.then(undefined, rejection))的别名,用于指定发生错误时的回调函数。
2、Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止
3、Promise对象抛出的错误不会传递到外层代码,即不会有任何反应,try不写catch发生错误会影响后面的执行
-
finally()
状态变化都会执行的操作
-
all()
Promise.all()方法用于将多个 Promise实例,包装成一个新的 Promise实例 都为fulfilled返回值组成数组进入then第一个函数回调。 只要有一个rejected,则进入失败回调。 传入的实例如果定义catch捕获,不会触发Promise.all()的catch方法
-
race()
race赛跑的意思。传入的promise实例数组哪个最快返回哪个,不管是什么状态
-
allSettled()
传入的promise实例数组都返回结果才结束,不管是什么状态
-
resolve()
// 等价于 new Promise(resolve => resolve('foo'))```
-
reject()
// 等价于 new Promise(((resolve, reject) => resolve('出错了'))```
promise构造函数是同步执行的,then方法是异步执行的
reject 是用来抛出异常,catch 是用来处理异常
reject 是 Promise 的方法,而 catch 是 Promise 实例的方法
reject后的东西,一定会进入then中的第二个回调,如果then中没有写第二个回调,则进入catch
网络异常(比如断网),会直接进入catch而不会进入then的第二个回调