Estoy escribiendo una clase JS, que llama a wasmFunc en el constructor y guarda su resultado en this.val . Sin embargo, debido a que wasmFunc es de un archivo WebAssembly, se debe llamar a una función asíncrona loadWasm antes de que se pueda llamar a wasmFunc . Así que estoy tratando de lograr algo como esto:
// index.js async loadWasm() { // load wasm file } export class MyClass { constructor() { await loadWasm(); // Cannot work this.val = wasmFunc(); } } export const myObj = new MyClass(); Idealmente, este archivo index.js debería exportar myObj que está listo para usar. Sin embargo, no se puede usar await en el constructor.
¿Alguna solución o idea?
Dado que una función solo puede hacer una de esas cosas, una función constructora no puede ser asíncrona.
Puede utilizar una función de ayuda:
// index.js async loadWasm() { // load wasm file } export class MyClass { constructor(wasm) { this.val = wasm; } } async function myClassFactory() { const wasm = await loadWasm(); const instance = new MyClass(wasm); return instance; } Deberá await el resultado de llamar a myClassFactory() .
También puede almacenar una promesa en el objeto que crea:
// index.js async loadWasm() { // load wasm file } export class MyClass { constructor() { const wasmPromise = loadWasm(); // Cannot work this.val = wasmPromise; } async doSomethingWithValue() { const wasm = await this.val; console.log(wasm); } }class MyClass { async constructor() { } }-> Error de sintaxis no detectado: el constructor de clase puede no ser un método asíncrono
Editar: Pero puedes esto.
class MyClass { constructor(args) { this.arguments = args; }; static async new(...args) { return new this(args); } } -> MyClass.new("test")export class MyClass { async loadWasm() { } async fn(){ await this.loadWasm(); // Cannot work this.val = wasmFunc(); } constructor() { this.fn() } } export const myObj = new MyClass();prueba esto. Esto debería funcionar para usted.