我的 Javascript 是否用完了 asyncIds ? (inspector_async_hook.js 中的 RangeError)

2024-03-01

首先,我经常使用 async 和 wait ,但出现此错误:

RangeError: Value undefined out of range for undefined options property undefined
    at Set.add (<anonymous>)
    at AsyncHook.init (internal/inspector_async_hook.js:19:25)
    at PromiseWrap.emitInitNative (internal/async_hooks.js:134:43)

我不知道如何解决这个问题,我完全用 Typescript 编写代码,并且没有创建任何名为“async_hooks”的文件。

而且我不会一次运行超过10个异步函数,我经常使用await,所以它不应该堆积起来,但javascript似乎不会减少asyncId并很快达到数量限制。

我尝试使用较少的 async wait 但这并没有解决问题,但错误消息稍后出现。如果我使用非常少的异步等待,我可以防止出现此错误,直到函数成功完成工作。 (我使用电子7)

Electron 似乎有一个非常低的异步池,但它可以通过默认的打字稿代码重现:

class Test {
    private async testCompare(a,b):Promise<boolean> {
        return a == b;
    }

    public async testRun():Promise<void> {
        for (let index = 0; index < 999999999; index++) {
            for (let index2 = 0; index2 < 999999999; index2++) {
                await this.testCompare(index,index2)
            }
        }
    }

}
new Test().testRun();

这段代码产生了非常多的内存使用量,我想我的程序中也有同样的问题。我认为异步池会被填满,直到达到极限。


我遇到了同样的错误Set.add正如您在我的设置大小达到 16777216 (2^24) 时所做的那样。我无法在文档中找到有关此限制的信息,但我假设集合仅限于 16777216 个唯一值?

使用简单的 for 循环即可轻松测试。

这将引发完全相同的错误:

let s = new Set();
for (let i = 0; i <= 16777216; i++) s.add(i);

这将成功运行:

let s = new Set();
for (let i = 0; i < 16777216; i++) s.add(i);

请注意,这会消耗大约 5GB 的内存,因此,如果由于内存限制而崩溃,请相应地增加堆限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 Javascript 是否用完了 asyncIds ? (inspector_async_hook.js 中的 RangeError) 的相关文章

随机推荐