# Trabajo asíncrono en Javascript: Promesas y async/await

Como desarrollador en JavaScript, es probable que hayas escuchado acerca de las promesas y el uso de async/await para manejar su flujo. En esta artículo, te explicaré qué son las promesas, cómo se usan y cómo async/await puede ayudar a manejar el flujo de trabajo.

## **Promesas**

Una promesa en JavaScript es un objeto que representa un valor que puede no estar disponible todavía, pero que se espera que lo esté en algún momento. Las promesas se utilizan para manejar operaciones asíncronas que toman tiempo en completarse, como hacer una solicitud HTTP o leer un archivo.

### **Creando una promesa**

Para crear una promesa en JavaScript, utilizamos el constructor <kbd>Promise</kbd>. Este constructor toma una función como argumento, que a su vez toma dos argumentos: <kbd>resolve</kbd> y <kbd>reject</kbd>. <kbd>resolve</kbd> se utiliza para devolver el valor de la promesa una vez que se ha completado exitosamente, mientras que <kbd>reject</kbd> se utiliza para devolver el error en caso de que la promesa falle.

```javascript
const promise = new Promise((resolve, reject) => {
  // ... do some async work
  if (success) {
    resolve(result);
  } else {
    reject(error);
  }
});

```

### **Consumiendo una promesa**

Para consumir una promesa, podemos usar los métodos <kbd>then</kbd> y <kbd>catch</kbd>. <kbd>then</kbd> se utiliza para manejar el valor de la promesa en caso de que se resuelva correctamente, mientras que <kbd>catch</kbd> se utiliza para manejar el error en caso de que la promesa falle.

```javascript
promise.then((result) => {
  console.log(result);
}).catch((error) => {
  console.error(error);
});

```

## **Async/Await**

<kbd>async/await</kbd> es una forma de manejar promesas en JavaScript que se introdujo en ES2017. <kbd>async</kbd> se utiliza para marcar una función como asincrónica, lo que significa que devolverá una promesa en lugar de un valor directo. <kbd>await</kbd> se utiliza dentro de una función <kbd>async</kbd> para esperar a que una promesa se resuelva antes de continuar con la ejecución del código.

### **Buenas prácticas**

Cuando se trabaja con <kbd>async/await</kbd>, es importante asegurarse de que se manejen correctamente los errores. Una forma de hacerlo es envolver el código <kbd>await</kbd> en un bloque <kbd>try/catch</kbd>.

```javascript
async function myFunction() {
  try {
    const result = await someAsyncFunction();
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

```

Además, es importante tener en cuenta que el uso excesivo de <kbd>async/await</kbd> puede afectar el rendimiento del código. Por lo tanto, se recomienda utilizarlo solo cuando sea necesario.

### **Malas prácticas**

Una mala práctica común cuando se trabaja con <kbd>async/await</kbd> es no manejar correctamente los errores. Si no se envuelve el código <kbd>await</kbd> en un bloque <kbd>try/catch</kbd>, los errores pueden propagarse y causar problemas en otras partes del código.

Otra mala práctica es utilizar <kbd>async/await</kbd> en funciones que no necesitan ser asincrónicas. Esto puede afectar negativamente el rendimiento y la legibilidad del código.

## **Conclusión**

En resumen, las promesas son una forma de manejar operaciones asíncronas en JavaScript, mientras que async/await es una forma más fácil de manejar el flujo de trabajo al trabajar con promesas. Es importante seguir buenas prácticas, como manejar correctamente los errores y utilizar async/await solo cuando sea necesario, para asegurarse de que el código sea legible y eficiente.

Si quieres profundizar más sobre el tema, te recomiendo siempre revisar la documentación oficial, seguirme en redes sociales o suscribirte a la newsletter del blog para seguir aprendiendo. Enjoy the journey!

### **Fuentes**

* [MDN Web Docs - Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
    
* [MDN Web Docs - async function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)
    
* [JavaScript.info](http://JavaScript.info) [- Async/await](https://javascript.info/async-await)
