2

estoy viendo las promises y async await en JavaScript. La sintaxis para generar ambas si la entiendo y puedo crearlas. Lo que no entiendo es porque usamos async await si las promesas ya se crean para generar tareas asíncronas. No entiendo el porque async await. ¿Me podeis ayudar a entender el porque existe cada uno y porque es necesario usar ambos?

Gracias.

kosode
  • 49
  • 7

2 Answers2

4

La idea general de async/wait es reducir codigo y hacerlo menos ruidoso.

Normalmente con las promesas se utiliza el metodo then() para esperar por la respuesta:

$http.get(url).then(function(){
   //..
});

Esto se traduce a:

var response = await $http.get(url);

Imagina ahora tener que esperar por un proceso asíncrono para ejecutar otro proceso asíncrono:

$http.get(url).then(function(response){
    //...
    $http.get(url + response.data.id).then(function(){
       console.log(response2.data.message);
    });
});

Y con async/await seria:

var response = await $http.get(url);
var response2 = await $http.get(url + response.data.id);
console.log(response2.data.message);

asyn/await tambien ayuda a evitar el callback hell y hace el código menos ruidoso en el sentido de que ya que el código sigue una linea constante de ejecución, hace que sea mas fácil el mantenimiento del mismo.

Nota: Como ya se menciono, solo puedes utilizar await dentro de una función marcada como async.

Einer
  • 20,190
  • 2
  • 14
  • 36
2

Las palabras claves async/await son a Promise lo que class es al prototipado clásico de Javascript: sugar syntax.

Sencillamente es una forma distinta de crear promesas sin tener que usar la clase Promise directamente:

//declaramos una función asincrona
async function  devuelveParam(param) {
  //el resultado se envolverá dentro de una promesa automáticamente
  return param;
}

// Estilo clásico para gestionar una promesa:
let promesa = devuelveParam('Hola'); 

promesa.then(function (p) {
  console.log(p);
});


//con await (ojo, sólo se puede usar await DENTRO de una función async(rona)
async function escribe(param) {
  let resultado = await devuelveParam(param);
  console.log(resultado);
}

escribe('Adios');
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
  • 5
    Hay gente a la que no le gusta poner ".then().then().then()...." y prefiere varias llamadas await consecutivas. – Kiko_L Oct 17 '18 at 10:30
  • tambien para entender la asincronia te invito a leer [Que es una promesa](https://es.stackoverflow.com/questions/64265/qu%C3%A9-es-una-promesa-en-javascript) – JackNavaRow Oct 17 '18 at 10:54