当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如果await永远不会返回怎么办?》经验,为你挑选了1个好方法。

在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> jfriend00..:

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

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

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

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有