Promise
它是一个ES6提出一个新语法,用来优化异步代码的写法。
在ES6中,它是新增的构造器(Array, Object, Promise),用来优化实现异步操作。在没有它之前,javascript中的异步处理,大多是利用回调函数来实现的。典型的几种如下:(1)setTimeout (2)ajax 现在有了promise,就可以对这些异步操作进行改写了
先说说定义
简单来说—Promise是个对象,毕竟万物皆对象,翻译一下也是承诺,啥是承诺,就是你承诺将来会执行的事情.比如路飞承诺自己会当上海贼王.
当然这个承诺可能会成功,所以路飞当上了海贼王–执行.then(‘路飞是海贼王’):
也有可能失败,路飞没当上海贼王回去继承他爹的革命军–执行.catch(‘路飞是革命军’)
then方法返回的是一个新的Promise实例(!!注意–这不是原来的Promise实例).因此可以采用链式写法,
就是then方法后面可以继续调用另一个then方法
catch方法是Promise只要发生错误就会被catch方法捕获到
经典格式
let p1 = new Promise((resolve, reject) => {
// resolve和reject是Promise内提供的2个函数, 用于回调返回结果到外面
resolve(成功结果) // 触发.then()小括号里函数体执行
reject(失败结果) // 触发.catch()小括号里函数体执行
})
p1.then((成功结果变量名) => {
}).catch((失败结果变量名) => {
}).finally(()=>{
// 一定会执行的代码
})
- resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”,触发.then的执行
- reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”,触发.catch的执行
Promise的三种状态和值
三种状态
(pending: 准备; resolved(或者fulfilled) 成功; rejected: 失败
准备:new实例化后, Promise对象(pending准备状态)
成功:当Promise内代码执行了resolve, 会导致所在的Promise对象 变成 fulfilled成功状态
失败:当Promise内代码执行了reject, 会导致所在的Promise对象 变成 rejected失败状态
值
resolve(值),这个值会自动传递给then
reject(值),这个值会自动传递给catch
then方法
作用
then方法的作用是为Promise对象添加状态改变时的回调函数。
then有两个参数,两个参数都是函数,其中第二个参数是可写可不写的
- 第一个参数是resolved状态的回调函数。当p的状态从pending变成了resolved,函数1会执行。
- 第二个参数是rejected状态的回调函数。 当p的状态从pending变成了rejected,函数2会执行。
var p = new Promise((resolve,reject)=>{
// resolve(val1);
reject(val2)
})
p.then(
okVal =>{
console.info("成功");
console.log(okValue);
},
errVal=>{
console.info("失败");
console.log(errValue);
}
)
它的两个参数都是函数,其执行逻辑是:
- 如果promise对象的状态是resolved,则then()会执行第一个函数,并传入当前的PromiseValue(即上面的val1);
- 如果promise对象的状态是rejected,则then()会执行第二个函数,并传入当前的PromiseValue(即上面的val2);
- 特别地,如果promise对象的状态是rejected,且此时then方法并没有设置第二个参数,就会向外抛出一个错误,错误的提示大约是Uncaught (in promise)
Promise还有许多静态方法
比如Promise.arr( ) Promise.race() Promise.allSettled()等
Promise.arr( )
作用: 合并多个Promise对象, 等待所有成功后, 返回结果
语法: Promise.all([promise对象1, promise对象2, …]).then()
特点: 返回最终结果是个数组, 值是按顺序对应小Promise对象的成功结果
注意: 如果有1个Promise失败, 则整个Promise对象则失败
Promise.race()
作用: 发起并行多个Promise对象, 等待只要任何一个有结果(成功|失败), 返回结果执行then
语法: Promise.race([promise对象1, promise对象2, …]).then()
特点: 返回第一个有结果的promise对象的结果(谁返回的速度快看谁)
Promise.allSettled()
Promise.allSettled([p1, p2,p3]) 和 Promise.all([p1, p2,p3])
如果p1,p2,p3都Ok, 他们的结果是一样的
如果p1,p2,p3有一个不成功,例如p1不成功,他们的结果是不一样的
Promise.all([p1, p2,p3]) ===> 失败的promise,值就p1的值
Promise.allSettled([p1, p2,p3])===> [p1的结果,p2的结果,p3的结果]