在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无法收集的任何悬挂线程/引用,或者这是非常安全和有效的使用?
答案 0 :(得分:5)
await
只是承诺之上的语法糖。它类似于ES6中的p.then()
语句。在ES6中,如果promise永远不会解析,那么.then()
处理程序中的代码永远不会执行。使用await
时,解释器必需将以下代码块放在自动创建的.then()
处理程序中。在内部,它几乎以同样的方式工作。
没有额外的线程在运行。 await
不使用线程。取决于承诺永远无法解决的确切原因,承诺本身可能永远不会因为内部而被GCed,因此可能仍然会在未来的某个时刻通过“可以”解决它的底层代码来引用它。
虽然这不是灾难,但它可能不是一个好的设计。如果某些条件承诺可能永远无法解决,那么您应该至少使用超时并清除对promise的引用或找到取消基础操作的方法。如果没有具体操作的具体细节,我们无法提供更具体的建议。