Promise.prototype.finally()
的作用
Promise.prototype.finally()
是 ES2018 新增的特性堤尾,它回一個(gè) Promise
郭宝,在 promise
結(jié)束時(shí),無(wú)論 Promise
運(yùn)行成功還是失敗粘室,都會(huì)運(yùn)行 finally
衔统,類似于我們常用的 try {...} catch {...} finally {...}
Promise.prototype.finally()
避免了同樣的語(yǔ)句需要在 then()
和 catch()
中各寫一次的情況
new Promise((resolve, reject) => {
setTimeout(() => resolve("result"), 2000)
})
.then(result => console.log(result))
.finally(() => console.log("Promise end"))
// result
// Promise end
reject
:
new Promise((resolve, reject) => {
throw new Error("error")
})
.catch(err => console.log(err))
.finally(() => console.log("Promise end"))
// Error: error
// Promise end
注意:
-
finally
沒(méi)有參數(shù) -
finally
會(huì)將結(jié)果和 error 傳遞
new Promise((resolve, reject) => {
setTimeout(() => resolve("result"), 2000)
})
.finally(() => console.log("Promise ready"))
.then(result => console.log(result))
// Promise ready
// result
手寫一個(gè) Promise.prototype.finally()
不管 Promise
對(duì)象最后狀態(tài)如何,都會(huì)執(zhí)行的操作
MyPromise.prototype.finally = function (cb) {
return this.then(function (value) {
return MyPromise.resolve(cb()).then(function () {
return value
})
}, function (err) {
return MyPromise.resolve(cb()).then(function () {
throw err
})
})
}