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:

javascriptfunction 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:

javascriptfunction 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:

javascriptasync 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:

javascriptasync function func() {
  let res = await getSmth(2);
  console.log(res); // exibirá 4
}

func();

Vamos chamar getSmth várias vezes:

javascriptasync 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:

javascriptasync 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();
Задание 1

Reescreva o seguinte código usando a sintaxe síncrona:

javascriptfunction func() {
  getSmth(2).then(res1 => {
    getSmth(3).then(res2 => {
      getSmth(4).then(res3 => {
        console.log(res1 + res2 + res3);
      });
    });
  });
}

func();