关于 Promise 的一些个人总结

12 篇文章 0 订阅

什么是 Promise?我认为通俗点讲,Promise是一个构造函数。Promise 使用方式:

let p = new Promise((resolve, reject) => {
    resolve("成功了!")
}).then(res => {
    console.log(res)
}).catch(res => {
    console.log(res)
})

Promise 在新建时可以选择性的传入两个值,其中第一个 resolve 是指成功状态执行,而第二个reject是指失败状态执行。

执行了resolve或者 reject后,会返回一个新的 Promise 对象,每个 Promise 对象都有一个 status 值。如果执行的是 resolve,则这个新 Promise 的 status 为reslove,如果执行的是 reject,则 status 为 reject。

当执行了 resolve 后,由于生成的新 Promise的 status 为 resolve,因此会执行.then 里的函数,同时.then里的参数就是 resolve 里传的。若是执行了 reject,则会进入 catch 里。

小 tips:如果在执行 resolve 时报错了,.catch 是可以捕捉到的,但是如果把.catch 写进.then 的第二个参数里,就没办法捕捉的。因此最好分开写。


 

一个非常有意思的例子:

const promise = new Promise(reject =>{
    reject("出错了!")
})
// 第一个 then()
.then(res =>{
console.log(`res1:${res}`) // 这里不执行
return 1
},err =>{
console.log(`err1:${err}`) // err1:出错了!
})
// 第二个 then()
.then(res =>{
console.log(`res2:${res}`) // 1
throw "这是一个错误提示!"
},err =>{
console.log(`err2:${err}`) // 这里不执行
})
// 第三个 then()
.then(res =>{
console.log(`res3:${res}`) // 这里不执行
},err =>{
console.log(`err3:${err}`) // 这是一个错误提示!
})
// 第四个 then()
.then(res =>{
console.log(`res4:${res}`) // undefined
},err =>{
console.log(`err4:${err}`) // 这里不执行
})
// 第五个 then()
.then(res =>{
console.log(`res5:${res}`) // undefined
},err =>{
console.log(`err5:${err}`) // 这里不执行
})

 

一开始执行 reject,所以执行.then 里的第二个参数。

执行完后新 promise 的状态为 resolve,因此执行后一个.then 的第一个函数 resolve。

在这里,resolve 里的throw报错了,抛出了一个字符串。

因此执行下一个.then 里的 reject,并把字符串当参数传入。后续由于每个执行里都没有返回值,所以一直执行 reslove。


所以我们可以总结一下:

  1. 如果前一个Promise对象是resolve状态,则后一个Promise对象执行第一个参数方法(resolve)
  2. 如果前一个Promise对象是reject状态,则后一个Promise对象执行第二个参数方法(reject)
  3. 如果前一个Promise对象抛出一个自定义的异常(throw),则后一个Promise对象执行第二个参数方法(reject)
  4. 如果前一个Promise对象返回具体的值,则此数值将作为后一个Promise对象的输入,执行第一个参数方法(resolve)
  5. 如果前一个Promise对象没有返回状态(resolve或者reject),也没有抛错(throw),也没有返回具体数值,我们则认为它返回 了一个undefined,则undefined将作为后一个Promise对象的输入,执行第一个参数方法(resolve)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值