Promesas en estilo síncrono en JavaScript
Para resolver el problema del promise hell se ideó una sintaxis especial de promesas, que permite escribir código asíncrono mucho más fácilmente - en estilo síncrono.
Vamos a proceder a estudiarlo. Para empezar tomemos el código de la lección anterior:
function func() {
getSmth(2).then(res => {
console.log(res); // mostrará 4
});
}
func();
Si nuestra función getSmth fuera
síncrona, entonces el código de la función func
podríamos reescribirlo de la siguiente manera:
function func() {
let res = getSmth(2);
console.log(res); // mostrará 4
}
La función getSmth, sin embargo, es asíncrona,
por lo tanto el código anterior no funcionará.
Pero, utilizando el estilo síncrono de promesas,
podremos obtener algo similar. Hagámoslo.
Para empezar debemos declarar nuestra función
func como asíncrona usando el comando especial
async:
async function func() {
}
Después de esto podremos dentro de la función func
utilizar el comando especial await.
Este comando, escrito antes de una promesa, hará
que JavaScript espere hasta que la promesa
se cumpla. Después de lo cual el comando devolverá
el resultado de la promesa, y la ejecución del código continuará.
En nuestro caso, debemos escribir await
antes de la llamada a getSmth. Dado que el resultado
de llamar a esta función será una promesa, la
ejecución posterior del código continuará solo después de
que esta promesa se cumpla. Bueno, y el resultado
de la promesa se puede guardar en una variable. Hagamos
lo descrito:
async function func() {
let res = await getSmth(2);
console.log(res); // mostrará 4
}
func();
Llamemos a getSmth varias veces:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // mostrará 13
}
func();
Y ahora llamemos a getSmth en un ciclo:
async function func() {
let arr = [1, 2, 3, 4, 5];
let sum = 0;
for (let elem of arr) {
sum += await getSmth(elem);
}
console.log(sum);
}
func();
Reescriba el siguiente código usando la sintaxis síncrona:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();