未完全消费的异步生成器是否会引发调用问题或内存占用?
问题解答
1. 会不会导致函数无法被调用?
不会。每次调用consumeValues()时,都会创建一个全新的异步生成器实例,各个实例之间完全独立、互不干扰。哪怕之前的生成器因为中途返回没执行完,新的函数调用依然能正常初始化新的生成器,执行到value === "b"时返回,不会影响后续调用。
2. 会不会占用内存?
会有临时内存占用,但不会造成永久内存泄漏,JS引擎的垃圾回收(GC)会自动处理:
- 每个未完成的异步生成器实例会持有自身的执行状态(比如当前执行到的代码位置、上下文变量等);
- 但当
consumeValues()返回后,对应的生成器实例没有被任何外部变量引用,JS引擎会在合适的时机把这些实例标记为可回收,释放占用的内存; - 例子里一次性创建10万个实例,在GC触发前会有明显的内存上升,但GC完成后内存会回落,不会一直占用。
简单说,每次consumeValues()里的produceValues()生成器,在循环到"b"时return,生成器的迭代就终止了,这个生成器对象没有被外部保存,当consumeValues()的Promise完成后,它就会被GC回收。
内容的提问来源于stack exchange,提问作者eran
相关产品推荐
相关产品推荐

