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

时间:2017-01-10 22:23:52

标签: javascript ecmascript-6 async-await

在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无法收集的任何悬挂线程/引用,或者这是非常安全和有效的使用?

1 个答案:

答案 0 :(得分:5)

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

没有额外的线程在运行。 await不使用线程。取决于承诺永远无法解决的确切原因,承诺本身可能永远不会因为内部而被GCed,因此可能仍然会在未来的某个时刻通过“可以”解决它的底层代码来引用它。

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