Búsqueda de sitios web

javascript - await function dentro de función de terceros no asíncrona


async function myAsyncFunc() : Promise<void> {
    // do async stuff
    // ex. delay with promise of setTimout
}

libraryObject.onBeforeDrawOnScreen(function(){
    myAsyncFunc(); // can't "await" or block.
});

¿Cómo puedo esperar antes de salir de 'onBeforeDrawOnScreen'?

A la biblioteca no le importa el tipo o valor de retorno del callback. No hay una verificación especial para el retorno de Promise, así que no 'await' en mi callback. Por eso no puedo agregar la palabra 'async' en el callback.

Estoy al tanto del bucle de eventos de JavaScript, pero... ¿Hay una solución alternativa?

Gracias

Respuesta #1

Vería si puedes encontrar una biblioteca mejor, o—si la biblioteca que estás usando es de código abierto—intenta contribuir con soporte asincrónico tú mismo. De lo contrario, realmente no hay manera de hacer esto.

Podría ocurrirte hacer lo que se llama una espera activa, donde tienes un bucle while que comprueba repetidamente algún estado que será cambiado por una promesa que se resuelve. Sin embargo, incluso esto no funcionará debido a la naturaleza de un solo hilo de JS. Los propios manejadores responsables de sacarte del bucle están bloqueados hasta que salgas del bucle. Nota: lo siguiente causará un bucle infinito, así que no lo hagas realmente:

libraryObject.onBeforeDrawOnScreen(function(){
    let done = false;
    let error = null;
    myAsyncFunc()
        .then(() => {
            done = true;
        }, (err) => {
            error = err;
            done = true;
        });
    while(!done);
    if (error) throw error;
});

Por eso el soporte async es tan crucial en muchas bibliotecas de JS.

Artículos relacionados