typescript - Har mitt Javascript slut på asyncIds? (RangeError i inspector_async_hook.js)


Först använder jag async och await väldigt ofta och jag får detta fel:

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)

Och jag vet inte hur jag kan fixa detta, jag skriver hela min kod i Typescript och jag har inte skapat någon fil som heter 'async_hooks'.

Och jag kör inte mer än 10 funktioner asynkront samtidigt, jag använder await väldigt ofta så det borde inte staplas, men javascript verkar inte minska asyncId och når nummergränsen väldigt snabbt.

Jag försökte använda mindre async await men detta löste inte problemet, men felmeddelandet kommer senare. Om jag använder väldigt lite async await kan jag förhindra att detta fel kommer tills funktionen lyckas slutföra jobbet. (Jag använder Electron 7)

Electron verkar ha ett mycket lågt asynkront pool men det kan reproduceras med en standard TypeScript-kod:

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();

Den här koden använder väldigt mycket RAM, och jag tror att jag har samma problem i mitt program. Jag tror att den asynkrona poolen fylls upp tills den når sin gräns.

Svar #1

Jag fick samma fel för Set.add som du gjorde när min mängds storlek nådde 16777216 (2^24). Jag kan inte hitta informationen om denna gräns i dokumentationen, men jag antar att mängder är begränsade till 16777216 unika värden?

Lätt att testa med en enkel for-loop.

Detta kommer att orsaka exakt samma fel:

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

Detta kommer att köras framgångsrikt:

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

Observera att detta kommer att använda upp ungefär 5 GB minne, så öka din heap-gräns därefter om det kraschar på grund av minnesbegränsningar.

Relaterade artiklar