【问题标题】:What happens if await never returns? [duplicate]如果 await 永远不会返回会发生什么? [复制]
【发布时间】:2017-05-25 13:45:09
【问题描述】:

在 ECMAScript 中,我使用的是 CancelablePromise (https://github.com/alkemics/CancelablePromise),它基本上只是一个带有 .cancel() 函数的 Promise。无论何时调用.cancel(),都不会执行提供给.then() 和.catch() 的回调。

我想知道如果我等待一个被取消的承诺会发生什么:

CancelablePromise promise = new CancelablePromise((resolve, reject) => resolve(1));
const promise2 = promise.then(x => x + 1);
promise.cancel();
console.log(await promise2);

所以这段代码按预期工作,控制台上没有打印任何内容。但是,我想知道这是否会创建任何无法被 GC 收集的挂起线程/引用,或者这是否完全安全有效地使用?

【问题讨论】:

  • 我想会有一些引用表明 GC 不能 collect 因为 GC 不会“知道”什么是可取消的 Promise - 抱歉我只能推测,也许有人知道每个 javascript 引擎的内部都可能会偶然发现这个问题并能够给出明确的答案:p
  • 不要使用那个库。它的实施很糟糕。
  • @Bergi,你能说得更具体点吗?
  • 关于实施?我宁愿不。但是是的,that library 在某些情况下确实会泄漏内存。

标签: javascript ecmascript-6 async-await


【解决方案1】:

await 只是 Promise 之上的语法糖。它类似于 ES6 中的 p.then() 语句。在 ES6 中,如果 promise 永远不会解析,那么 .then() 处理程序中的代码永远不会执行。对于await,解释器必须将以下代码块放入自动创建的.then() 处理程序中。在内部,它的工作方式几乎相同。

没有多余的线程在运行。 await 不使用线程。根据 promise 永远不会解析的确切原因,promise 本身可能永远不会被 GC,因为在内部,可能仍然存在底层代码对​​它的引用,这些引用在未来的某个时候“可能”解决它。

虽然这不是一场灾难,但它可能不是一个好的设计。如果在某些情况下 Promise 可能永远无法解决,那么您可能至少应该使用超时并清除对 Promise 的引用,或者找到一种方法来取消底层操作。如果没有具体操作的具体细节,我们无法提供更具体的建议。

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 2011-03-01
    • 1970-01-01
    • 2018-04-08
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多