Modernizar con fetch() y await
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeEste capítulo no está relacionado con la modernización de Symfony. Pero el resto de nuestro código -incluido JavaScript- ¡también merece modernizarse!
Utilizar fetch() en lugar de axios
Dentro de song-controls_controller.js, originalmente utilizaba axios para hacer llamadas Ajax.
| // ... lines 1 - 11 | |
| import axios from 'axios'; | |
| // ... line 13 | |
| export default class extends Controller { | |
| // ... lines 15 - 18 | |
| play(event) { | |
| // ... lines 20 - 21 | |
| axios.get(this.infoUrlValue) | |
| // ... lines 23 - 26 | |
| } | |
| } |
Ya no lo hago. En su lugar, utiliza la función incorporada fetch().
Elimina axios con:
php bin/console importmap:remove axios
Desaparece de importmap.php. Luego borra el import... y este comentario mientras estamos aquí. Sustituye axios.get() por sólo fetch(). Luego, para ver si esto funciona, console.log(response).
| // ... lines 1 - 2 | |
| export default class extends Controller { | |
| // ... lines 4 - 7 | |
| play(event) { | |
| // ... lines 9 - 10 | |
| fetch(this.infoUrlValue) | |
| .then((response) => { | |
| console.log(response); | |
| const audio = new Audio(response.data.url); | |
| audio.play(); | |
| }); | |
| } | |
| } |
En la tierra de los navegadores, pulsa el botón de reproducción para activar el método. Genial! Las dos últimas líneas no funcionan, ¡pero vemos la respuesta! Ha hecho una llamada Ajax.
Cuando escribí esto originalmente, utilicé .then() para manejar la Promesa. Ya no suelo utilizarlo para manejar código asíncrono. En su lugar, utilizo el más sencillo await.
Uso de await y async
Delante de fetch, pon const response = await fetch(). Luego copia el interior de la llamada de retorno y ponlo justo después.
| // ... lines 1 - 2 | |
| export default class extends Controller { | |
| // ... lines 4 - 7 | |
| async play(event) { | |
| // ... lines 9 - 10 | |
| const response = await fetch(this.infoUrlValue); | |
| console.log(response); | |
| //const audio = new Audio(response.data.url); | |
| //audio.play(); | |
| } | |
| } |
Esto dice: haz la llamada a fetch(), espera a que termine y luego ejecuta este código. Es mucho más sencillo de leer y escribir.
Aunque, probablemente te hayas fijado en mi editor enfadado:
el operador await sólo puede utilizarse en una función asíncrona.
Para utilizar await, tenemos que añadir async antes de la función en la que estamos directamente. No entraré en detalles, pero esto anuncia que nuestra función es ahora asíncrona. Si la llamaras y quisieras el valor de retorno, también necesitarías await esa llamada.
Pero en nuestro caso, Stimulus está llamando a este método... y definitivamente no le importa nuestro valor de retorno. Así que añadir async no cambia nada.
Cuando lo probamos... el mismo resultado, sin la llamada de retorno.
Así que terminemos con esto: const data = await response.json().
Esto toma el JSON de la respuesta de nuestra ruta API y lo convierte en un objeto. Y sí, también es una función asíncrona, ¡así que await vuelve a ser útil! A continuación, pasa data.url a Audio.
| // ... lines 1 - 2 | |
| export default class extends Controller { | |
| // ... lines 4 - 7 | |
| async play(event) { | |
| event.preventDefault(); | |
| const response = await fetch(this.infoUrlValue); | |
| const data = await response.json(); | |
| const audio = new Audio(data.url); | |
| audio.play(); | |
| } | |
| } |
Luego celebra, ese dulce, dulce Rickroll. Código moderno, sin sistema de compilación: la vida es buena.
Ahora que estamos actualizados, vamos a dar una vuelta por algunas de mis nuevas funciones favoritas, empezando por las bondades del autocableado que podrían significar que nunca volverás a editarservices.yaml.
4 Comments
How dare you Rick Roll me Ryan !!!! Ahahhaha JK thanks for yet an amazing tutorial <3 <3 <3
Hey @stlgaits ,
Whoops, haha :) Thanks for your nice feedback ;)
Stay tuned for more tunes :p
Cheers!
I hope this amazing tutorial, may include a video about how to setup symfony/ux-react using typescript components.
🤞🤞
Sorry @john-erney-rojas :). React/Vue/etc just isn't something I'm into much right now. Nothing wrong with them - but I much prefer the approaches in LAST stack - https://symfonycasts.com/screencast/last-stack
I can tell you, however, to continue using Encore if you want to use React (or if you're building a full SPA in React, use their frontend tools and Symfony as a pure API).
Cheers!
"Houston: no signs of life"
Start the conversation!