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

时间:2019-04-26 06:30:34

标签: javascript node.js promise es6-promise

问题是这样的

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?还说:“总之,至少在现代浏览器中,只要没有外部引用,您就不必担心未解决的承诺。”因此,如果这样做的话,让诺言保留在待定状态似乎是可以的。

3 个答案:

答案 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来检查诺言是否按时完成。 因此,如果您忘记将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'));