【发布时间】:2020-12-11 12:52:54
【问题描述】:
我正在实现一个名为 timeout 的函数,以将一个承诺转换为如果未在最短时间内解决则将拒绝的承诺。
通过以下实现,当传递给 timeout 的承诺在分配的时间之前被拒绝时,我会在 Chrome 开发工具中收到 uncaught (in promise) 消息。
function timeout(promise, duration, message) {
const timeoutPromise = new Promise((_, reject) => {
const handle = setTimeout(() => {
reject(new TimeoutError(message ?? "Operation timed out."))
}, duration)
promise.finally(() => clearTimeout(handle)) //problem line
})
return Promise.race([promise, timeoutPromise])
}
但是,如果我将其更改为以下内容,我似乎没有问题。
function timeout(promise, duration, message) {
const timeoutPromise = new Promise((_, reject) => {
const handle = setTimeout(() => {
reject(new TimeoutError(message ?? "Operation timed out."))
}, duration)
const clear = () => clearTimeout(handle)
promise.then(clear).catch(clear)
})
return Promise.race([promise, timeoutPromise])
}
我试图了解在第二种情况下调用then 和catch 与在第一种情况下调用finally 有何不同。
【问题讨论】:
标签: javascript ecmascript-6 es6-promise