Promise 为何出现?
为解决原生 Ajax 的回调地狱问题,优雅的表示异步回调功能。
Promise 实例化对象的状态 PromiseResult:
- pending 待定
- fulfilled 实现---经过 resolve()
- rejected 拒绝---经过 reject()
状态只能从 pending 变化到 fulfilled 或者 rejected,只能改变一次。
const p1 = new Promise((resolve, reject) => {
resolve("ok") //代表实现
// reject("error") //代表拒绝
})
Promise 实例方法 then:
实例方法包括:then,catch,finally。
then:指定用于得到成功 value 的成功回调和用于得到失败 reason 的失败回调,并将返回一个新的 Promise 实例化对象。
- 成功的状态:执行then方法的第一个回调函数;
- 失败的状态:执行then方法的第二个回调函数;
then 的返回值的 Promise 实例化对象的状态取决于回调函数中的内容:
- 如果返回为非 Promise 的实例化对象,则得到一个成功的 Promise;
const p1 = new Promise((resolve, reject) => {
resolve("ok") //代表实现
})
const result = p1.then(value => {
return value;
}
console.log(result); // PromiseResult:"ok"
- 如果返回为 Promise 的实例化对象,则 Promise 实例化对象的状态和结果值将直接影响 result 常量的状态和结果值;
const p1 = new Promise((resolve, reject) => {
resolve("ok")
})
const result = p1.then(value => {
return new Promise((resolve, reject) => {
resolve("success")
});
}
console.log(result); // PromiseResult:"success"
- 如果为抛出异常,则新的 Promise 实例化对象 result 为失败的 Promise。
const p1 = new Promise((resolve, reject) => {
resolve("ok") //代表实现
})
const result = p1.then(value => {
throw '异常信息'
}
console.log(result); // PromiseState:"rejected" PromiseResult:"异常信息"
Promise.all:
简而言之:所有事件都已经执行才成功,任何一个事件失败了都失败
Promise.all 主要针对多个 Promise 的异步任务的处理。
需要接受一个数组类型的参数;
返回值:Promise 对象,此对象的 PromiseState 由接受到的每一个 Promise 对象决定:
- 当所有 Promise 对象的状态都是成功的,结果就是成功的 Promise,PromiseResult 是每一个 Promise 的 PromiseResult 组成的数组。
const p1 = new Promise((resolve, reject) => {
resolve("ok")
})
const p2 = new Promise((resolve, reject) => {
resolve("hello")
})
const p3 = new Promise((resolve, reject) => {
resolve("success")
})
const result = Promise.all([p1,p2,p3])
console.log(result);
打印结果:
- 当所有 Promise 对象的状态但凡有一个失败的,结果就是失败的 Promise,PromiseResult 是失败的那个 Promise 的 PromiseResult 。
const p1 = new Promise((resolve, reject) => {
resolve("ok")
})
const p2 = new Promise((resolve, reject) => {
resolve("hello")
})
const p3 = new Promise((resolve, reject) => {
reject("error")
})
const result = Promise.all([p1,p2,p3])
console.log(result); // PromiseResult:"error"
Promise.allSettled:
简而言之:所有事件都有结果了就执行,无论这些事件成功或失败
传参与 all 一致
Promise.any:
简而言之:任意一个事件成功了就执行
除非所有事件都失败,否则 any 返回的 Promise 实例化对象一定成功。
Promise.race:
简而言之:race 即赛跑,任意一个事件成功或者失败了就执行
即谁第一个从 pending 变为 fulfilled 或者 rejected 就执行
Promise.reject:
返回一个状态为 rejected 的 Promise 对象。
Promise.resolve:
返回一个状态为 resolved 的 Promise 对象。
Promise 实例方法 catch:
与 then 用法类似,区别是只处理失败的回调。
经常与 then 结合使用:
// catch 与 then 结合使用
p1.then(value =>{
console.log(value);
}).catch(reason => {
console.log(reason);
})
异常穿透:当有多个 then,可以只在最后写一个 catch。当 Promise 实例化对象的状态为 rejected 时,则会一直向下穿透到 catch 方法:
// catch 异常穿透
p1.then(value =>{
console.log(value);
}).then(value =>{
console.log(value);
}).then(value =>{
console.log(value);
}).catch(reason => {
console.log(reason);
})
Promise 实例方法 finally:
(ES9新方法)finally 表示无论 Promise 对象变成了 fulfilled 还是 rejected 状态,最终都会执行。
finally 方法的回调函数不接受参数
const p1 = new Promise((resolve, reject) => {
reject("error")
})
p1.then(value => {
console.log(value);
}).catch(reason => {
console.log(reason);
}).finally(()=>{
console.log("最后我被执行了");
})
执行结果:可见无论状态是成功与失败,都会运行一遍。