1

Tengo una duda en cuanto al concepto de sincrono/asincrono con fetch, por ejemplo yo tengo un sitio que quiere consumir una api externa, en este sitio tengo:

  <h1>Titulo</h1>
  <p> **aca va el parrafo que consumo de una api externa** </p>
  <footer> pie de pagina</footer>

El codigo no es importante lo pongo a modo de ejemplo, entonces...

CASO SINCRONO : suponiendo que la api externa falla o no se encuentra disponible o tiene un delay demasiado largo, de forma sincrona se cargaria h1 ,pero se quedaria en la etiqueta p y nunca se mostraria el footer.

CASO ASINCRONO : suponiendo que la api externa falla o no se encuentra disponible o tiene un delay demasiado largo, de forma asincrona se cargaria h1 ,pasaria de la etiqueta p (por que espera una promesa) continua y se mostraria el footer.

Primera pregunta- ¿Lo estoy entendiendo bien o estoy equivocado?

Segunda pregunta- ¿fetch me realiza esta tarea de forma asincrona? o necesita la sintaxis de async/await? por q no entiendo si async/await es solo una manera mas corta y prolija que realizarlo, en lugar de unicamente con fetch utilizar promesas tras promesas, basicamente quiero saber, si es lo mismo utlizar fetch o utilizar fetch con async/await.

Solo necesito entender mis dudas en cuanto a las 2 preguntas que planteo, porque no se si estoy entendiendo el concepto correctamente.

Shiki
  • 490
  • 4
  • 17
  • 1
    Puede que [esta respuesta](https://es.stackoverflow.com/questions/277690/qué-diferencias-hay-entre-callbacks-promises-y-async-await/277693#277693) sea de ayuda – g.4 Sep 17 '21 at 01:29
  • Mmmm..... para tu primera pregunta, esto depende como lo hagas pero... sí, estas equivocado. Si el contenido de ese párrafo es puesto con un `innerHTML` o algo parecido entonces simplemente tu `

    ` se queda vacío y el resto carga, ya que el HTML está diseñado así, pero si tu `footer` depende de tu `

    ` claramente este no cargará.

    – Christian Sep 17 '21 at 03:20
  • Según lo que entiendo y sé, el `fetch` ya es asíncrono y se puede ver claramente ya que retorna una promesa y la promesas necesitan ser resueltas, es decir, esperar por su respuesta. Y recordemos que las peticiones HTTP siempre son asíncronas :D – Christian Sep 17 '21 at 03:25

1 Answers1

1

Voy a comenzar por suponer que estas trabajando con javascript sin librerías, porque si trabajas con librerías como React el comportamiento del DOM cambiaria.

Para explicarlo, primero tienes que entender como funciona el navegador:

El DOM (los tags de html) se pre-cargan primero en el navegador tal y como están en el html. Luego javascript actúa sobre ellos junto a las hojas de estilo (css), y finalmente son renderizados y mostrados al usuario.

En este proceso el código de JavaScript se ejecuta de forma síncrona(secuencial), por lo cual la pagina se renderizaría antes de que fetch(una funcion asíncrona) sea capaz de entregar la respuesta, esto quiere decir que <footer> si se renderizaría, sin embargo <p> quedaría vacío.

En resumen, que una función sea asíncrona no quiere decir que el hilo de ejecucion vaya a esperar que dicha función tenga una respuesta, si no que la va a ejecutar "paralelamente" dentro del mismo hilo y continuar con la siguiente instrucción.

Para esto de las API, javascript nos presenta el siguiente event listener (entre otros): document.addEventListener('DOMContentLoaded', ()=>{}); que es una funcion(callback) que se ejecuta de manera automática una vez que el DOM ya ha sido renderizado.

Ejemplo simplificado:

document.addEventListener('DOMContentLoaded', ()=>{
  fetch('http://localhost:3000/api').then(respuesta=>{
    document.getElementById('id_del_elemento').innerHTML(respuesta) //agrega respuesta al DOM
  }).catch(error=>{
    console.log(error)
  })
});

El termino async/await dicho de manera simple es una forma alternativa de realizar promesas que se implemento con la llegada ECMAScript.

Kirioz
  • 26
  • 2
  • 1
    El hilo de ejecución se ejecuta de forma paralela con la función async, ¿Cómo sabemos en qué momento ya se tiene disponible la respuesta de la función async? – g.4 Sep 17 '21 at 12:26
  • Realmente, no es que sea "paralela", pero lo exprese de esa forma para que sea más sencillo de entender como se comporta en el hilo de ejecución en el renderizado web. Realmente fetch() retorna un objeto promise que luego es donde llegara la respuesta de dicha consulta. Se utiliza la función then() para evaluar dicha promesa tanto para cuando retorna exitosamente, como para si la falla, pero como mencione anteriormente para cuando llegue dicha respuesta es probable que el sitio web ya haya terminado el renderizado. – Kirioz Sep 17 '21 at 18:20