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