JavaScript 101 — Async/Await

Pedro Dava
3 min readAug 9, 2018

A pedido do Rosário Pereira Fernandes hoje trago o tema Async/Await.

No post anterior falei sobre o Assíncrono e síncrono [Link] com base nos conhecimentos do post anterior podemos falar um bocado sobre este tópico.

Mas para podermos falar sobre async/await primeiro terei que explicar certos conceitos que são callbacks e promises.

Callbacks

Um callback é uma função que deve ser executada após a conclusão de outra função daí o nome “callback”, a tempos atrás era muito usado para fazer gerenciamento de assincronia.

Exemplo uma Rotina da manhã de uma pessoa pode seguir os seguintes steps.

//Rotina da manhã
function wakeUp(){
console.log("Acordar");
}
function workout(){
console.log("exercitar");
}
function takeBath(){
console.log("Tomar Banho");
}
function haveBreakFast(){
console.log("Nham Nham Nham");
}
wakeUp();
workout();
takeBath();
haveBreakFast();
output:
// Acordar
// Exercitar
// Tomar Banho
// Nham Nham Nham

Neste primeiro exemplo está “tudo bem” mas quando chegamos a fase onde temos funções sequenciais onde uma depende da resposta de outra(s) funções começamos a ter certos problemas, como gerenciamento do código, entre outras.

Exemplo: existem Pessoas que para workout() primeiro tem seu BreakFast() então seguindo esse ponto de vista, neste caso teríamos que esperar que a pessoas nos confirmasse se teve o seu Breakfast() antes de efectuar outra tarefa.

function wakeUp(){
console.log("Acordar");
}
function workout(){
setTimeout(function(){
console.log("exercitar");},5000);
}
function takeBath(){
console.log("Tomar Banho");
}
function haveBreakFast(){
console.log("Nham Nham Nham");
}
wakeUp();
workout();
takeBath();
haveBreakFast();
output:
// Acordar
// Nham Nham Nham
// Tomar Banho
// Exercitar

Um dos problemas de callbacks.

Em funções sequenciais com dependência entre elas torna-se complicado gerir entender o código muitas vezes criando “callback hell” e por vezes código poderá executar sem nenhuma confirmação do resultado da chamada anterior.

Promises

Promise veio para poder resolver certos problemas encontrados nos callbacks. Por definição promise é um Objecto que pode retornar um valor no futuro: um valor resolvido (sucesso) ou um valor não resolvido (erro), podendo realizar tarefa consoante o resultado retornado.

Promise contém três estados: fulfilled, rejected or pending. Mas apenas usamos dois onde colocamos funções para manipular tipos de respostas “estados” que são : Fulfilled “resolve” e Rejected.

function takeBath(){
return new Promise( function (resolve, reject) {
resolve("Banho Tomado");
reject("Agua Estava Gelada");
})
}
takeBath()
.then(function(result){haveBreakfast();}) // Banho tomado com sucesso
.catch(function(error){console.log(error)}); // Erro

Async/Await

Na Programação Async/Await é uma característica sintática que permite que uma função assíncrona seja estruturada de maneira similar a uma função síncrona comum.

Podemos dizer que o “Async/Await ” mais uma forma de poder gerenciar estruturas como “Promises”, e o seu objectivo é dar espaço ou oportunidade para o programa executar outras funções enquanto aguarda a conclusão de uma tarefa assíncrona de longa execução. Exemplo: requests em API’s.

async function takeBath(){ //do something}
async function workout(){ //do Something}
async function goWork(){ //Do Something}
async function doAll(){
var bathResult = await takeBath();
var workoutResult = await workout(bathResult);
var endResult = await goWork(workoutResult);
return endResult;
}doAll().then (function (result) => { console.log(result);})
.catch((error) => { console.log(error);});

Um dos maiores beneficios:

  • Evita sobrecarga na execucao do codigo.
  • Melhor leitura e entendimento do código pelos devs.
  • Aumenta perfomance e capacidade de resposta melhorando user experience.

Exemplo 1 “comparação de código”:

// Async/Await
async function helloAsync() {
return "hello";
}
// Promises
function helloAsync() {
return new Promise(function (resolve) {
resolve("hello");
});
}
// Callback
function helloAsync(){
function doSomething(){
function doSomethingElse() {}
}
}

Exemplo 2 “comparação de código”:

// Async/Await 
async function multiply(a, b) {
return a * b;
}
async function foo() {
var result = await multiply(2, 5);
return result;
}
// Erros serão tratados aqui(async function () {
var result = await foo();
console.log(result);
})();
//Promises
function multiply(a, b) {
return new Promise(function (resolve) {
resolve(a * b);
});
}
function foo() {
return new Promise(function(resolve) {
multiply(2, 5).then(function(result) {
resolve(result);
});
);
}
// Erros serão tratados aquinew Promisefunction() {
foo()
.then(function(result) {console.log(result);})
.catch(error){console.log(error)};
});

Por hoje e tudo espero que tenha sido util o post.

Sintam-se livre para comentar , sugerir correções “ melhores exemplos”, dicas para proximo tópico.

Thank You até a próxima.

facebook: Jose Pedro Dava

twitter: @josepedrodava

--

--