问题是这样的
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')
})
当我无法调用“解决”或“拒绝”时,甚至都不会调用finally块!为什么?
我以为这是一个错误,然后我发现原始作者似乎是故意这样做的,如果他既未调用解决方案也不拒绝,则不应调用then / catch / finally,即在这种情况下不应采取后续行动。
但这是处理不应该采取后续行动的情况的有效方法吗?会造成什么麻烦吗?
-----更新-----
即使我的问题被标记为重复,我对得到的答案仍然不满意。最初,我认为让诺言永远保持待定状态是一个坏主意。
但是SO中的回答是“不应有副作用”。
Does never resolved promise cause memory leak?还说:“总之,至少在现代浏览器中,只要没有外部引用,您就不必担心未解决的承诺。”因此,如果这样做的话,让诺言保留在待定状态似乎是可以的。
答案 0 :(得分:1)
在内部,承诺可以处于以下三种状态之一:
待定,当最终值尚不可用时。这是唯一可能转换为其他两个状态之一的状态。 已完成,何时以及是否有最终值可用。履行价值与承诺永久相关。这可以是任何值,包括未定义。 已拒绝,如果错误导致无法确定最终值。拒绝原因与承诺永久相关。它可以是任何值,包括未定义的值,尽管它通常是一个Error对象,例如在异常处理中。
https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Promise
在您的情况下,promise处于待处理状态,调用demo函数将始终处于等待状态被实现或拒绝的状态。
答案 1 :(得分:0)
总是希望一个诺言能够解决或拒绝。 如果您打算不进行任何后续操作,则可以使用空数据集进行解析,也可以使用适合您的用例的错误代码进行拒绝。
答案 2 :(得分:0)
您可以使用Promise.race
来检查诺言是否按时完成。
因此,如果您忘记将resolve
或reject
兑现为诺言,那么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'));