【发布时间】:2019-09-15 15:14:15
【问题描述】:
问题是这样的
function demo() {
return new Promise((resolve, reject) => {
...
// The problem here!!
//I just found in some rare case we failed to call resolve or reject
})
}
demo()
.then(res => {
console.log('resolve')
console.log(res)
})
.catch(rej => {
console.log('reject')
console.log(rej)
})
.finally(() => {
console.log('why')
})
当我调用resolve或reject失败时,连finally块都没有被调用!为什么?
我原以为这是一个错误,然后我发现原作者似乎故意这样做,如果他没有调用 resolve 或 reject,则不应调用 then/catch/finally,即在这种情况下 不应采取后续行动。
但是这是一种有效的方式来处理不应该采取后续行动的情况吗?会不会有什么麻烦?
-----更新-----
即使我的问题被标记为重复,我仍然对我得到的答案不满意。最初我认为让 Promise 永远处于待处理状态是个坏主意。
但是 SO 中的答案说“应该没有副作用。”
Does never resolved promise cause memory leak? 还说“简而言之 - 至少在现代浏览器中 - 你不必担心未解决的承诺,只要你没有对它们的外部引用”。因此,如果这是目的,让 promise 处于待处理状态似乎是可以的。
【问题讨论】:
-
是的,正如预期的那样——如果既没有调用
resolve也没有调用reject,Promise 不知道异步操作已经完成,因此没有任何处理程序附加到 Promise 运行。但是永远挂起的承诺是一个坏主意 - 最好修复代码,以便它最终解决或拒绝 -
我不这么认为,因为如果
then和catch都没有被调用,这会让demo的消费者感到困惑。我认为最好解决(或拒绝)包含表明不应再做任何事情的信息的内容,例如resolve('No action needed') -
只有修复返回 Promise 的函数 - 你必须重构
demo -
demo实际上在做什么?我无法想象不解决 Promise 的场景是有意义的。 -
@Qiulang 它可以工作(如您所见,没有任何反应),但我仍然认为这是一种不好的做法:它违背了大多数人的期望,就像
finally从未发生过一样。非终止循环同样糟糕。
标签: javascript node.js promise es6-promise