Estoy usando nodeJS. Quiero esperar a que una propiedad dentro de un objeto se vuelva verdadera y luego continuar con la ejecución del código.
Así es como se ve mi código:
export async function createRun() { try { let shared = { url: "", device: "", finished: new Promise(() => {}) }; const browser = await launch(); const page = await browser.newPage(); await page.setDefaultNavigationTimeout(0); await page.setBypassCSP(true); await page.exposeFunction( "onMessageReceivedEvent", async (e: { type: string; data: Message }) => { if (e.data === "finished") { shared.finished = ; } } ); const listenFor = (type: string) => { return page.evaluateOnNewDocument((type: any) => { window.addEventListener(type, (e) => { // @ts-ignore window.onMessageReceivedEvent({ type, data: e.data }); }); }, type); }; await listenFor("message"); console.log('before'); // wait for shared.finished to become true // continue execution console.log('after') }¿Cómo se puede implementar esto? ¡Gracias por adelantado!
Si necesita ir por este camino, puede intentar algo como esto (lo siento, no sé TS):
export async function createRun() { try { let resolver; let shared = { url: "", device: "", finished: new Promise((resolve) => { resolver = resolve; }) }; const browser = await launch(); const page = await browser.newPage(); await page.setDefaultNavigationTimeout(0); await page.setBypassCSP(true); await page.exposeFunction( "onMessageReceivedEvent", async (e: { type: string; data: Message }) => { if (e.data === "finished") { resolver(); } } ); const listenFor = (type: string) => { return page.evaluateOnNewDocument((type: any) => { window.addEventListener(type, (e) => { // @ts-ignore window.onMessageReceivedEvent({ type, data: e.data }); }); }, type); }; await listenFor("message"); console.log('before'); await shared.finished; // continue execution console.log('after') } Sin embargo, page.waitForFunction() puede ser una solución más simple, como se sugiere en el comentario.