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