如果await永远不会返回怎么办?

Flo*_*Flo 3 javascript async-await ecmascript-6

在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);
Run Code Online (Sandbox Code Playgroud)

因此,此代码按预期工作,控制台上没有任何内容.但是,我想知道这是否会创建任何无法由GC收集的悬挂线程/引用,或者这是非常安全且有效的?

jfr*_*d00 6

await只是在承诺之上的语法糖.它类似于p.then()ES6中的声明.在ES6中,如果promise永远不会解析,那么.then()处理程序中的代码永远不会执行.使用时await,解释器必需将以下代码块放在自动创建的.then()处理程序中.在内部,它几乎以同样的方式工作.

没有额外的线程在运行. await不使用线程.根据承诺永远不会解决的确切原因,承诺本身可能永远不会得到GCed,因为在内部,可能仍然会在未来的某个时刻"可以"解决它的底层代码对​​它的引用.

虽然这不是灾难,但它可能不是一个好的设计.如果某些条件承诺可能永远无法解决,那么您应该至少使用超时并清除对promise的引用或找到取消基础操作的方法.如果没有具体操作的具体细节,我们无法提供更具体的建议.