await没有返回
let p = new Promise(resolve => {})
const noReturn = async function() {
const res = await p()
return res
}
某处多次调用noReturn
方法,会不会有什么不好的影响?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
p
到底是Promise
,还是是函数?如果p
是Promise
,会有不好的影响,否则不会。当前V8的Promise的实现,会在满足以下条件的时候回收掉所有
.then
链的上下文:所以以下代码完全没有问题,所有东西都会被正确回收
上面的代码中,1和2满足,因为没有变量存着那个空
Promise
,所以3也满足,所以async
内的所有上下文都被释放,collectable
只剩下了空壳Monad,薛定谔的猫早跑掉了。而这段代码会造成内存泄漏
上面的代码会造成内存泄漏,只有
deadPromise = null
之后才能回收。一点后话,我猜题主也是在想,如果我们没有
AbortablePromise
,那我们至少能明确标示出一个Promise可以被垃圾回收吧?幸运的是,我们可以,但是要用到上面这样的hack。不过,现在我们有
AbortController
了,说明社区已经基本上对AbortablePromise
怎么实现有了共识:应该throw出去。这样的话,我们就不应该用这样的hack了,而应该与fetch
它们保持一致。会,从代码看(我觉得是示例代码没写好的原因吧),大量的
promise
处于pending
状态,一是gc
没法回收,二是event loop
每个阶段之间都要检查promise
。