SlideShare una empresa de Scribd logo
By: Martin Suarez (suarezcm)
Arturo Guillen (guillenba)
Agenda
• Sincrono
• Asincrono
• Promesas
• Async – await
• Async / await vs Promesas
• React setState()
• Ejemplos del setState
• Consultas, comentarios o sugerencias
Sincrono (Sync)
En un proceso SINCRONO podríamos imaginar tener un proceso "A" y
un proceso "B" estos no se ejecutan al mismo tiempo en paralelo, es
decir si por ejemplo envió ambos a ejecutarse A dura 5 segundos y B 10
segundos, B tendría que esperar que A termine de ejecutarse para el
poder entonces ejecutarse en total estas operaciones consumirían 15
segundos.
Asincrono (Async)
En un proceso ASINCRONO podríamos imagine tener un proceso "A" y
un proceso "B" estos se ejecutan al mismo tiempo en paralelo, es decir
si por ejemplo envió ambos a ejecutarse A dura 5 segundos y B 10
segundos, en total estas operaciones consumirían 10 segundos.
Promesas (Promises)
Una promesa representa un valor que puede estar disponible ahora, en el futuro, o
nunca.
Promesas (Promises) 1
Una Promesa es un proxy para un valor no necesariamente conocido
en el momento que es creada la promesa. Permite asociar
manejadores que actuarán asincrónicamente sobre un eventual valor
en caso de éxito, o la razón de falla en caso de una falla.
async / await
Las funciones Async/await, nos ayudan a escribir código completamente
síncrono mientras realizamos tareas asíncronas en segundo plano.
async / await
Una nueva forma de escribir código asíncrono es Async/Await está
basado en promises, así que no está bloqueando el flujo.
La gran diferencia es que el código asíncrono se parece y se
comporta un poco más al código síncrono. Aquí es donde reside todo
su poder.
Las opciones anteriores para el código asíncrono eran callbacks
(llamadas de retorno) y promises.
Async / await
vs Promesas
Async / await vs
Promesas (Scope)
Async / await vs
Promesas (Logic)
Async / await vs
Promesas (Error)
Problemas con el setState
¿Qué hace setState?
setState() programa una
actualización al objeto estado de un
componente. Cuando el estado cambia,
el componente responde volviendo a
renderizar.
¿Por qué setState me está dando el valor incorrecto?
En React,
tanto this.props como this.state representan los
valores renderizados, es decir, lo que hay
actualmente en la pantalla.
Las llamadas a setState son asíncronas; no
te fíes de que this.state refleje el nuevo
valor inmediatamente después de llamar
a setState
incrementCount() {
// Nota: esto *no* funcionará como se espera.
this.setState({count: this.state.count + 1});
}
handleSomething() {
// Digamos que `this.state.count` se inicia en 0.
this.incrementCount();
this.incrementCount();
this.incrementCount();
// Cuando React rerenderiza el componente, `this.state.count` será 1, pero tu esperabas 3.
// Esto es porque la función anterior `incrementCount()` lee de `this.state.count`,
// pero React no actualiza `this.state.count` hasta que el componente se vuelve a renderizar.
// Entonces `incrementCount()` termina leyendo `this.state.count` como 0 cada vez, y lo establece
a 1.
}
Ejemplo de código que no se comportará como se espera
¿Cómo actualizo el estado con valores que
dependen del estado actual?
Pasa una función en lugar de un objeto a setState para asegurarte de
que la llamada siempre use la versión más actualizada del estado
incrementCount() {
this.setState((state) => {
// Importante: lee `state` en vez de `this.state` al actualizar.
return {count: state.count + 1}
});
}
handleSomething() {
// Digamos que `this.state.count` inicia en 0.
this.incrementCount();
this.incrementCount();
this.incrementCount();
// Si lees `this.state.count` ahora, aún sería 0.
// Pero cuando React vuelva a renderizar el componente, será 3.
}
Ejemplo de un comportamiento esperado, utilizando una función
¿Cuándo setState es asíncrono?
Esto se traduce en mejoras
significativas de rendimiento.
DIV Padre
DIV hijo
Evento onClick actualiza
propiedad A del estado
Evento onClick actualiza
propiedad B del estado
React intencionalmente
esperara todas las
actualizaciones para
realizar un solo render.
setState es asíncrono dentro de
los controladores de eventos.
Esto garantiza, por
ejemplo, que si Parent y Child llaman a set
State durante un evento de click, Child no
se renderiza dos veces.
¿Se puede ejecutar una función cuando el setState
haya actualizado el estado correctamente ?
setNumeroElevado_EjemploBuenaPractica(estado,funcionExitosa){
this.setState({...estado}, funcionExitosa);
}
Ejemplos del setState
Bibliografía
• Kent, J (2019). Async/await Como Funcionan Realmente. Javascript, 1(1), 1. Recuperado de:
https://www.ma-no.org/es/programacion/javascript/async-await-como-funcionan-realmente-un-ejemplo
• Firefox, M (2020). Función async. Javascript, 1(1), 1. Recuperado de:
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/funcion_asincrona
• Firefox, M (2020). Promise. Javascript, 1(1), 1. Recuperado de:
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Promise
• React, R (2020). Estado del componente. Javascript, 1(1), 1. Recuperado de: https://es.reactjs.org/docs/faq-
state.html#:~:text=Actualmente%2C%20setState%20es%20as%C3%ADncrono%20dentro,final%20del%20eve
nto%20del%20navegador.
• Nolan, T (2020). Cómo escribir código asíncrono en Node.js. Javascript, 1(1), 1. Recuperado de:
https://www.digitalocean.com/community/tutorials/how-to-write-asynchronous-code-in-node-js-es
• Hoehne, K (2018). Async/Await vs Promises — A Guide and Cheat Sheet. Javascript, 1(1), 1. Recuperado de:
https://levelup.gitconnected.com/async-await-vs-promises-4fe98d11038f
• Mogollón, P (2018). Callbacks vs Promise vs Async/Await en JavaScript. Javascript, 1(1), 1. Recuperado de:
http://www.paulomogollon.com/promises-vs-async-await-vs-callbacks-en-javascript-espanol/

Más contenido relacionado

La actualidad más candente

09slide
09slide09slide
Asynchronous javascript
 Asynchronous javascript Asynchronous javascript
Asynchronous javascript
Eman Mohamed
 
Programa calculadora
Programa calculadoraPrograma calculadora
Programa calculadora
jbersosa
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
Logan Chien
 
Java Concurrency by Example
Java Concurrency by ExampleJava Concurrency by Example
Java Concurrency by Example
CodeOps Technologies LLP
 
Javascript
JavascriptJavascript
Javascript
Fahrizal Nuansa
 
RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019
Fabio Biondi
 
An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java Developers
Kostas Saidis
 
Spring Boot
Spring BootSpring Boot
Spring Boot
Pei-Tang Huang
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2
Knoldus Inc.
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]
Iakiv Kramarenko
 
Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)
Prashanth Kumar
 
Angular - Chapter 7 - HTTP Services
Angular - Chapter 7 - HTTP ServicesAngular - Chapter 7 - HTTP Services
Angular - Chapter 7 - HTTP Services
WebStackAcademy
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
Trey Howard
 
React js t2 - jsx
React js   t2 - jsxReact js   t2 - jsx
React js t2 - jsx
Jainul Musani
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 JavaScript - Chapter 9 - TypeConversion and Regular Expressions  JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
WebStackAcademy
 
What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...
What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...
What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...
Simplilearn
 
ADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet CommunicationADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet Communication
Riza Nurman
 
Unit Testing in Java
Unit Testing in JavaUnit Testing in Java
Unit Testing in Java
Ahmed M. Gomaa
 
Spring Framework - MVC
Spring Framework - MVCSpring Framework - MVC
Spring Framework - MVC
Dzmitry Naskou
 

La actualidad más candente (20)

09slide
09slide09slide
09slide
 
Asynchronous javascript
 Asynchronous javascript Asynchronous javascript
Asynchronous javascript
 
Programa calculadora
Programa calculadoraPrograma calculadora
Programa calculadora
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
 
Java Concurrency by Example
Java Concurrency by ExampleJava Concurrency by Example
Java Concurrency by Example
 
Javascript
JavascriptJavascript
Javascript
 
RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019
 
An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java Developers
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]
 
Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)
 
Angular - Chapter 7 - HTTP Services
Angular - Chapter 7 - HTTP ServicesAngular - Chapter 7 - HTTP Services
Angular - Chapter 7 - HTTP Services
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
React js t2 - jsx
React js   t2 - jsxReact js   t2 - jsx
React js t2 - jsx
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 JavaScript - Chapter 9 - TypeConversion and Regular Expressions  JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 
What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...
What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...
What Is Selenium? | Selenium Basics For Beginners | Introduction To Selenium ...
 
ADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet CommunicationADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet Communication
 
Unit Testing in Java
Unit Testing in JavaUnit Testing in Java
Unit Testing in Java
 
Spring Framework - MVC
Spring Framework - MVCSpring Framework - MVC
Spring Framework - MVC
 

Similar a Sync - Async.pptx

Sync - Async.pdf
Sync - Async.pdfSync - Async.pdf
Sync - Async.pdf
Arturo Guillén
 
Lenguajesdeprogramacion c nivel1-unidad4-01-estatuto while
Lenguajesdeprogramacion c nivel1-unidad4-01-estatuto whileLenguajesdeprogramacion c nivel1-unidad4-01-estatuto while
Lenguajesdeprogramacion c nivel1-unidad4-01-estatuto while
Carlos
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Ignacio Martín
 
Estructuras repetitivas (bloques de instrucciones)
Estructuras repetitivas (bloques de instrucciones)Estructuras repetitivas (bloques de instrucciones)
Estructuras repetitivas (bloques de instrucciones)
Royer Lopez Nuñez
 
Java básico
Java  básicoJava  básico
Java básico
María Luisa Velasco
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignaciones
flekoso
 
1.1 palabras reservadas para hacer un pseudocódigo
1.1 palabras reservadas para hacer un pseudocódigo1.1 palabras reservadas para hacer un pseudocódigo
1.1 palabras reservadas para hacer un pseudocódigo
Gioo
 
Introduccion a C++
Introduccion a C++Introduccion a C++
Introduccion a C++
LenHugo
 
Hi Fiber!
Hi Fiber!Hi Fiber!
Fundamentos
Fundamentos Fundamentos
Fundamentos
Diomedesmorron
 
Lenguaje de programacion C++ 4
Lenguaje de programacion C++ 4Lenguaje de programacion C++ 4
Lenguaje de programacion C++ 4
David
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
chembe
 
Unidad4
Unidad4Unidad4
Unidad4
JHONNY
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
chembe
 
Unidad4
Unidad4Unidad4
Unidad4
JHONNY
 
Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4
camnav
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
yesid19
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
chembe
 
ESTATUTO WHILE
ESTATUTO WHILEESTATUTO WHILE
ESTATUTO WHILE
charnisch
 
Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4
charnisch
 

Similar a Sync - Async.pptx (20)

Sync - Async.pdf
Sync - Async.pdfSync - Async.pdf
Sync - Async.pdf
 
Lenguajesdeprogramacion c nivel1-unidad4-01-estatuto while
Lenguajesdeprogramacion c nivel1-unidad4-01-estatuto whileLenguajesdeprogramacion c nivel1-unidad4-01-estatuto while
Lenguajesdeprogramacion c nivel1-unidad4-01-estatuto while
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
 
Estructuras repetitivas (bloques de instrucciones)
Estructuras repetitivas (bloques de instrucciones)Estructuras repetitivas (bloques de instrucciones)
Estructuras repetitivas (bloques de instrucciones)
 
Java básico
Java  básicoJava  básico
Java básico
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignaciones
 
1.1 palabras reservadas para hacer un pseudocódigo
1.1 palabras reservadas para hacer un pseudocódigo1.1 palabras reservadas para hacer un pseudocódigo
1.1 palabras reservadas para hacer un pseudocódigo
 
Introduccion a C++
Introduccion a C++Introduccion a C++
Introduccion a C++
 
Hi Fiber!
Hi Fiber!Hi Fiber!
Hi Fiber!
 
Fundamentos
Fundamentos Fundamentos
Fundamentos
 
Lenguaje de programacion C++ 4
Lenguaje de programacion C++ 4Lenguaje de programacion C++ 4
Lenguaje de programacion C++ 4
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
 
Unidad4
Unidad4Unidad4
Unidad4
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
 
Unidad4
Unidad4Unidad4
Unidad4
 
Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
 
Repeticiones
RepeticionesRepeticiones
Repeticiones
 
ESTATUTO WHILE
ESTATUTO WHILEESTATUTO WHILE
ESTATUTO WHILE
 
Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4Lenguajesdeprogramacion c nivel1-unidad4
Lenguajesdeprogramacion c nivel1-unidad4
 

Sync - Async.pptx

  • 1. By: Martin Suarez (suarezcm) Arturo Guillen (guillenba)
  • 2. Agenda • Sincrono • Asincrono • Promesas • Async – await • Async / await vs Promesas • React setState() • Ejemplos del setState • Consultas, comentarios o sugerencias
  • 3. Sincrono (Sync) En un proceso SINCRONO podríamos imaginar tener un proceso "A" y un proceso "B" estos no se ejecutan al mismo tiempo en paralelo, es decir si por ejemplo envió ambos a ejecutarse A dura 5 segundos y B 10 segundos, B tendría que esperar que A termine de ejecutarse para el poder entonces ejecutarse en total estas operaciones consumirían 15 segundos.
  • 4. Asincrono (Async) En un proceso ASINCRONO podríamos imagine tener un proceso "A" y un proceso "B" estos se ejecutan al mismo tiempo en paralelo, es decir si por ejemplo envió ambos a ejecutarse A dura 5 segundos y B 10 segundos, en total estas operaciones consumirían 10 segundos.
  • 5. Promesas (Promises) Una promesa representa un valor que puede estar disponible ahora, en el futuro, o nunca.
  • 6. Promesas (Promises) 1 Una Promesa es un proxy para un valor no necesariamente conocido en el momento que es creada la promesa. Permite asociar manejadores que actuarán asincrónicamente sobre un eventual valor en caso de éxito, o la razón de falla en caso de una falla.
  • 7.
  • 8. async / await Las funciones Async/await, nos ayudan a escribir código completamente síncrono mientras realizamos tareas asíncronas en segundo plano.
  • 9. async / await Una nueva forma de escribir código asíncrono es Async/Await está basado en promises, así que no está bloqueando el flujo. La gran diferencia es que el código asíncrono se parece y se comporta un poco más al código síncrono. Aquí es donde reside todo su poder. Las opciones anteriores para el código asíncrono eran callbacks (llamadas de retorno) y promises.
  • 10.
  • 11.
  • 12. Async / await vs Promesas
  • 13. Async / await vs Promesas (Scope)
  • 14. Async / await vs Promesas (Logic)
  • 15. Async / await vs Promesas (Error)
  • 16. Problemas con el setState
  • 17. ¿Qué hace setState? setState() programa una actualización al objeto estado de un componente. Cuando el estado cambia, el componente responde volviendo a renderizar.
  • 18. ¿Por qué setState me está dando el valor incorrecto? En React, tanto this.props como this.state representan los valores renderizados, es decir, lo que hay actualmente en la pantalla. Las llamadas a setState son asíncronas; no te fíes de que this.state refleje el nuevo valor inmediatamente después de llamar a setState
  • 19. incrementCount() { // Nota: esto *no* funcionará como se espera. this.setState({count: this.state.count + 1}); } handleSomething() { // Digamos que `this.state.count` se inicia en 0. this.incrementCount(); this.incrementCount(); this.incrementCount(); // Cuando React rerenderiza el componente, `this.state.count` será 1, pero tu esperabas 3. // Esto es porque la función anterior `incrementCount()` lee de `this.state.count`, // pero React no actualiza `this.state.count` hasta que el componente se vuelve a renderizar. // Entonces `incrementCount()` termina leyendo `this.state.count` como 0 cada vez, y lo establece a 1. } Ejemplo de código que no se comportará como se espera
  • 20. ¿Cómo actualizo el estado con valores que dependen del estado actual? Pasa una función en lugar de un objeto a setState para asegurarte de que la llamada siempre use la versión más actualizada del estado
  • 21. incrementCount() { this.setState((state) => { // Importante: lee `state` en vez de `this.state` al actualizar. return {count: state.count + 1} }); } handleSomething() { // Digamos que `this.state.count` inicia en 0. this.incrementCount(); this.incrementCount(); this.incrementCount(); // Si lees `this.state.count` ahora, aún sería 0. // Pero cuando React vuelva a renderizar el componente, será 3. } Ejemplo de un comportamiento esperado, utilizando una función
  • 22. ¿Cuándo setState es asíncrono? Esto se traduce en mejoras significativas de rendimiento. DIV Padre DIV hijo Evento onClick actualiza propiedad A del estado Evento onClick actualiza propiedad B del estado React intencionalmente esperara todas las actualizaciones para realizar un solo render. setState es asíncrono dentro de los controladores de eventos. Esto garantiza, por ejemplo, que si Parent y Child llaman a set State durante un evento de click, Child no se renderiza dos veces.
  • 23. ¿Se puede ejecutar una función cuando el setState haya actualizado el estado correctamente ? setNumeroElevado_EjemploBuenaPractica(estado,funcionExitosa){ this.setState({...estado}, funcionExitosa); }
  • 25.
  • 26. Bibliografía • Kent, J (2019). Async/await Como Funcionan Realmente. Javascript, 1(1), 1. Recuperado de: https://www.ma-no.org/es/programacion/javascript/async-await-como-funcionan-realmente-un-ejemplo • Firefox, M (2020). Función async. Javascript, 1(1), 1. Recuperado de: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/funcion_asincrona • Firefox, M (2020). Promise. Javascript, 1(1), 1. Recuperado de: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Promise • React, R (2020). Estado del componente. Javascript, 1(1), 1. Recuperado de: https://es.reactjs.org/docs/faq- state.html#:~:text=Actualmente%2C%20setState%20es%20as%C3%ADncrono%20dentro,final%20del%20eve nto%20del%20navegador. • Nolan, T (2020). Cómo escribir código asíncrono en Node.js. Javascript, 1(1), 1. Recuperado de: https://www.digitalocean.com/community/tutorials/how-to-write-asynchronous-code-in-node-js-es • Hoehne, K (2018). Async/Await vs Promises — A Guide and Cheat Sheet. Javascript, 1(1), 1. Recuperado de: https://levelup.gitconnected.com/async-await-vs-promises-4fe98d11038f • Mogollón, P (2018). Callbacks vs Promise vs Async/Await en JavaScript. Javascript, 1(1), 1. Recuperado de: http://www.paulomogollon.com/promises-vs-async-await-vs-callbacks-en-javascript-espanol/