javascript - 当 return new Promise((resolve, reject) => {}) 忘记调用 resolve 或 reject 时会发生什么?

标签 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')
    })

当我调用resolve或reject失败时,连finally block 都没有调用!为什么?

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

但这是否是处理不应采取后续行动的情况的有效方法?会不会有什么问题?

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

即使我的问题被标记为重复,我仍然对我得到的答案不满意。本来我认为让 promise 永远停留在 pending 状态是个坏主意。

但是那个 SO 中的答案说“应该没有副作用。”
Does never resolved promise cause memory leak?还说“简而言之 - 至少在现代浏览器中 - 只要你没有对它们的外部引用,你就不必担心 Unresolved promise ”。因此,如果这是目的,让 promise 保持待处理似乎是可以的。

最佳答案

在内部, promise 可以处于三种状态之一:

Pending,当最终值尚不可用时。这是唯一可以过渡到其他两个状态之一的状态。 Fulfilled,最终值(value)何时以及是否可用。履行值(value)与 promise 永久相关。这可以是任何值,包括未定义的。 拒绝,如果错误阻止了最终值的确定。拒绝原因与 promise 永久关联。这可以是任何值,包括未定义的,尽管它通常是一个错误对象,就像在异常处理中一样。

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

在您的例子中,promise 处于挂起状态,调用演示函数将始终等待 promise 状态被履行或拒绝。

关于javascript - 当 return new Promise((resolve, reject) => {}) 忘记调用 resolve 或 reject 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55861970/

相关文章:

javascript - 将 header 添加到 JavaScript WCF 服务调用

javascript - 与手动设置单元格宽度不一致

c++ - 使用 node-gyp 构建时无法加载 node.js native 插件,但使用 Visual Studio 构建时它可以工作

node.js - 将 Mongoose 流转换为数组

node.js - 有条件包含在 Jade + Express 中

javascript - Cypress : Setting a variable from the result of a task

javascript - 当 CSS 禁用滚动时使用 jQuery 滚动

javascript - Node.js Promise 未按顺序执行

mysql - 如何在 nodejs 中使用 promise 执行两个 mysql 查询?

javascript - 具有固定标题且主体上无滚动的 Bootstrap 表