当返回新的承诺((解析,拒绝)=>{})忘记调用解析或拒绝时会发生什么?



问题是这样的

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 或拒绝失败时,甚至没有调用 finally 块!为什么?

我曾以为这是一个错误,然后我发现原作者似乎是故意这样做的,如果他不调用 resolve 或拒绝,则不应调用 then/catch/finally ,即在这种情况下不应采取后续行动

但是,这是处理不应采取后续行动的情况的有效方法吗?会不会造成什么麻烦?

-----更新-----

即使我的问题被标记为重复,我仍然对我得到的答案不满意。最初,我认为让承诺永远处于待定状态是一个坏主意。

但SO的答案是"不应该有副作用"。
从未解决的承诺会导致内存泄漏吗?还说"简而言之 - 至少在现代浏览器中 - 只要你没有外部引用,你就不必担心未解决的承诺"。因此,如果这是目的,让承诺保持悬而未决似乎是可以的。

在内部,承诺可以处于以下三种状态之一:

挂起,当最终值尚不可用时。这是唯一可能过渡到其他两个状态之一的状态。已实现,当最终值可用时以及是否可用。履行值与承诺永久关联。这可以是任何值,包括未定义。如果错误阻止确定最终值,则拒绝。 拒绝原因与承诺永久关联。这可以是任何值,包括未定义值,尽管它通常是 Error 对象,就像在异常处理中一样。

https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Promise

在您的情况下,承诺处于挂起状态,调用 demo 函数将始终等待承诺状态实现或拒绝。

承诺总是被期望解决或拒绝。 如果您打算不执行跟进,则可以使用空数据集进行解析,也可以使用适合您的用例的错误代码拒绝。

您可以使用Promise.race来检查承诺是否按时完成。 因此,如果你忘了打电话给resolvereject你的承诺,那么Promise.race延迟后仍然会被解决或拒绝。

var promise1 = new Promise(function(resolve, reject) {
setTimeout(reject, 500);
});
var promise2 = new Promise(function(resolve, reject) {
});
Promise.race([promise1, promise2]).then(function(value) {
console.log(value);
}).catch(err => console.log('promise rejected'));

最新更新