Promises em estilo síncrono em JavaScript
Para resolver o problema do promise hell, foi criada uma sintaxe especial para promises, permitindo escrever código assíncrono de forma muito mais fácil - no estilo síncrono.
Vamos começar a estudá-la. Primeiro, pegaremos o código da lição anterior:
function func() {
getSmth(2).then(res => {
console.log(res); // exibirá 4
});
}
func();
Se nossa função getSmth fosse
síncrona, o código da função func
poderia ser reescrito da seguinte forma:
function func() {
let res = getSmth(2);
console.log(res); // exibirá 4
}
A função getSmth, no entanto, é assíncrona,
portanto, o código acima não funcionará.
Mas, usando o estilo síncrono de promises,
poderemos obter algo semelhante. Vamos fazer isso.
Primeiro, devemos declarar nossa função
func como assíncrona usando o comando
especial async:
async function func() {
}
Após isso, poderemos usar o comando especial
await dentro da função func.
Este comando, escrito antes de uma promise, fará com que
o JavaScript espere até que a promise
seja cumprida. Depois disso, o comando retornará
o resultado da promise, e a execução do código continuará.
No nosso caso, devemos escrever await
antes da chamada de getSmth. Como o resultado
da chamada dessa função será uma promise, a execução
subsequente do código continuará apenas após
o cumprimento dessa promise. E o resultado
da promise pode ser armazenado em uma variável. Vamos fazer
o descrito:
async function func() {
let res = await getSmth(2);
console.log(res); // exibirá 4
}
func();
Vamos chamar getSmth várias vezes:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // exibirá 13
}
func();
E agora vamos chamar getSmth em um loop:
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();
Reescreva o seguinte código usando a sintaxe síncrona:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();