Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

515
Views
¿Cómo puedo obtener $ magics para admitir async?

Una característica muy admirada de HTMX entre los principiantes es su capacidad para abstraer javascript y realizar solicitudes de recuperación desde el backend directamente en el marcado.

No me gusta HTMX porque creo que es realmente limitante, me encanta Alpine y no me gusta usar múltiples marcos, pero me gustaría tener la posibilidad de hacer una solicitud simple de mi backend para completar un elemento en mi dom desde dentro de Alpine sin llamar específicamente a una función para hacer eso.

Creé esta funcionalidad usando una función simple que llamé xfetch en el ejemplo a continuación, que simplemente pasa una URL y devuelve el elemento relevante en x-text, x-html o variable en x-data. Se puede utilizar en alpino de la siguiente manera:

 <div x-data> <span x-text="await xfetch("url")> </div>

Creo que implementar esto de una manera sencilla, sin entrar en los detalles de las promesas, etc., sería realmente útil para los principiantes que comienzan con Alpine como su primer marco JS.

Idealmente, haría de esto una magia alpina llamada $fetch , pero no puedo encontrar la manera de hacer que la magia funcione bien con async y await.

Mi código actual es el siguiente:

 <html lang="en"> <head> <script defer src="https://unpkg.com/alpinejs@3.xx/dist/cdn.min.js"></script> </head> <body> <div x-data="{ time: xfetch('http://date.jsontest.com', method = 'GET', jsonItem='time') }"> <p> This pulls the time from an object in x-data: <span x-text="await time"></span> </p> <p> ... but you can also pass a url right into the x-text: <span x-text="await xfetch('http://date.jsontest.com', method = 'GET', jsonItem='date')"> </span> </p> </div> <script> async function xfetch(url, method='GET', jsonItem=null) { return fetch(url, { method: method, }) .then((response) => response.json()) .then((responseJson) => { return responseJson[jsonItem] }); } </script> </body> </html>

Lo ideal sería agregar:

 document.addEventListener('alpine:init', () => { Alpine.magic('fetch', () => url => { return await xfetch(url, method='GET', jsonItem=null) }) })

pero creo que esto no funciona porque el asíncrono no funciona cuando lo pongo en $magic.

Dos preguntas:

  1. ¿Es posible que una función mágica ejecute y espere el resultado de un comando asíncrono?
  2. ¿Es posible pasar múltiples variables a una función $magic?

Gracias

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

EDITAR: Actualizar esta respuesta como @Super y yo trabajamos en esto y parece que descubrimos las respuestas a las preguntas originales planteadas.

  1. aparece mientras es posible que una magia maneje los resultados asíncronos, parece que solo puede hacer esto si no hay argumentos para la función asíncrona representada por $magic
  2. sí, se pueden pasar varios argumentos a $magic

SIN EMBARGO: parece que no puede hacer ambas cosas al mismo tiempo. Parece que no puede tener una magia $ que sea asíncrona y también acepte argumentos.


  1. Creo que lo que necesitas aquí es asíncrono "hasta el final". No pude probar definitivamente su ejemplo ya que recibí un error de CORS al solicitar los datos, pero probé con un controlador local aquí que devuelve algunos datos y obtuve mi resultado.
  2. Cambié su función de flecha a una función estándar y agregué una segunda función arg.

También me gustaría señalar que HTMX tiene una funcionalidad ajax que maneja y resuelve los resultados de Promesa asíncrona por usted.

Para su ejemplo, tal vez intente algo como esto

 <script> async function xfetch(url, method = 'GET', jsonItem = null) { let response= await fetch(url, { method: method, }) .then((response) => response.json()) .then((responseJson) => { return responseJson[jsonItem] }); return response; } document.addEventListener('alpine:init', async () => { Alpine.magic('fetch', async function(url,otherdata) { let response = await xfetch(url, method = 'GET', jsonItem = null) return await response.text(); }) }) </script>
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!