sincronas promesas programacion funciones ejemplo ejecucion controlar await async asincronia asincrona javascript node.js async-await

javascript - promesas - Uso de esperar fuera de una función asíncrona



promesas typescript (3)

Aún mejor es poner un punto y coma adicional delante del bloque de código

;(async () => { await ... })();

Esto evita que el formateador automático (por ejemplo, en vscode) mueva el primer paréntesis al final de la línea anterior.

El problema se puede demostrar en el siguiente ejemplo:

const add = x => y => x+y const increment = add(1) (async () => { await ... })();

Sin el punto y coma, se volverá a formatear como:

const add = x => y => x+y const increment = add(1)(async () => { await Promise(1) })()

lo que obviamente está mal porque asigna la función asíncrona como parámetro y e intenta llamar a una función desde el resultado (que en realidad es una cadena extraña ''1async () => {...}'' )

Intentaba encadenar dos funciones asíncronas, porque la primera tenía un parámetro de retorno condicional que hacía que la segunda se ejecutara o saliera del módulo. Sin embargo, he encontrado un comportamiento extraño que no puedo encontrar en las especificaciones.

async function isInLobby() { //promise.all([chained methods here]) let exit = false; if (someCondition) exit = true; }

Este es un fragmento bastardo de mi código (puede ver el alcance completo here ), que simplemente comprueba si un jugador ya está en un lobby, pero eso es irrelevante.

A continuación tenemos esta función asíncrona.

async function countPlayer() { const keyLength = await scardAsync(game); return keyLength; }

Esta función no necesita ejecutarse si exit === true .

Intenté hacer

const inLobby = await isInLobby();

Esto esperaba esperar resultados, por lo que puedo usar inLobby para ejecutar condicional countPlayer , sin embargo, recibí un error de tipo sin detalles específicos.

¿Por qué no puede await una función async fuera del alcance de la función? Sé que es una promesa de azúcar, por lo que debe encadenarse then pero ¿por qué en countPlayer puedo esperar otra promesa, pero afuera, no puedo await isInLobby ?


El nivel superior en await no es compatible. Hay algunas discusiones del comité de estándares sobre por qué esto es así, como este tema de Github .

También hay un artículo de reflexión en Github sobre por qué esperar al máximo nivel es una mala idea. Específicamente, sugiere que si tiene un código como este:

// data.js const data = await fetch( ''/data.json'' ); export default data;

Ahora, cualquier archivo que importe data.js no se ejecutará hasta que se complete la búsqueda, por lo que toda la carga de su módulo ahora está bloqueada. Esto hace que sea muy difícil razonar sobre el orden del módulo de la aplicación, ya que estamos acostumbrados a ejecutar Javascript de nivel superior de forma síncrona y previsible. Si esto se permitiera, saber cuándo se define una función se vuelve complicado.

Mi perspectiva es que es una mala práctica que su módulo tenga efectos secundarios simplemente cargándolo. Eso significa que cualquier consumidor de su módulo obtendrá efectos secundarios simplemente requiriendo su módulo. Esto limita mucho dónde se puede usar su módulo. Un nivel superior en await probablemente significa que estás leyendo desde alguna API o llamando a algún servicio en el momento de la carga. En su lugar, solo debe exportar las funciones asíncronas que los consumidores pueden usar a su propio ritmo.


Siempre hay esto, por supuesto:

(async () => { await ... })();

Esto hace una función rápida con asíncrono donde puede usar esperar. ¡Le ahorra la necesidad de crear una función asíncrona que es genial! // créditos Silve2611