finally
finally表示不是最终的意思,而是无论如何都会执行的意思
如果返回一个promise,会等待这个promise也执行完毕(如果是失败的promise, 会用他的失败原因传给下一个人)
# 用法
# promise成功态,无参数返回
Promise. resolve(123). finally((data) => {
// finally 无参数
console. log(data, 'finally') // undefined finally
})
# promise成功态,会走向下一个then的成功回调
Promise. resolve(123). finally((data) => {
console. log(data, 'finally') // undefined finally
}). then(data => {
console. log(data, 'success') // 123 'success'
})
# 如果promise失败状态,需要用catch来捕获错误
Promise. reject(123). finally((data) => {
// finally 无参数
console. log(data, 'finally') // undefined. .
}). catch(err => {
console. log(err) // 报错
})
# 如果返回一个promise,会等待这个promise先执行完毕
Promise. reject(123). finally((data) => {
// finally 无参数
console. log('finally')
return new Promise((resolve, reject) => {
setTimeout(_ => {
resolve('ok')
}, 3000)
})
}). then(data => {
console. log(data, 'success')
}). catch(err => {
console. log(err, 'err') // 报错
})
立即执行输出 'finally',过3s输出 '123 err'
Promise. reject(123). finally((data) => {
// finally 无参数
console. log('finally')
return new Promise((resolve, reject) => {
setTimeout(_ => {
reject('ok')
}, 3000)
})
}). then(data => {
console. log(data, 'success')
}). catch(err => {
console. log(err, 'err') // 报错
})
立即执行输出 'finally',过3s输出 'ok err'
# Promise. finally源码
Promise. finally核心
- 在Promise原型上挂载finally 方法
- Promise. finally实质是一个then方法类比Promise. resolve. then
- Promise. resolve(callback()),使用Promise. resolve会等callback的函数执行完再返回结果,并将上一个then的value返回
Promise. prototype. finally = function(callback) {
return this. then((value) => {
return Promise.resolve(callback()).then(() => value)
}, (reason) => {
return Promise.resolve(callback()).then(() => {throw reason})
})
}