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

Dan*_*GTA 6 javascript asynchronous promise async-await typescript

首先,我经常使用 async 和 await 并收到此错误:

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)
Run Code Online (Sandbox Code Playgroud)

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

而且我一次不运行超过 10 个函数 async 我经常使用 await 所以它不应该堆叠但 javascript 似乎没有减少 asyncId 并很快达到数量限制。

我尝试使用 less async await 但这并没有解决问题,但是错误 msg 稍后出现。如果我使用非常少的异步等待,我可以防止出现此错误,直到函数成功完成工作。(我使用电子 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();
Run Code Online (Sandbox Code Playgroud)

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

Mun*_*umi 13

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

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

这将抛出完全相同的错误:

let s = new Set();
for (let i = 0; i <= 16777216; i++) s.add(i);
Run Code Online (Sandbox Code Playgroud)

这将成功运行:

let s = new Set();
for (let i = 0; i < 16777216; i++) s.add(i);
Run Code Online (Sandbox Code Playgroud)

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

  • “地图”的限制相同 (2认同)