尚硅谷 Promise 课程笔记上(Promise 基础)

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("最后我被执行了"); 
})

执行结果:可见无论状态是成功与失败,都会运行一遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值