Entonces, después de haber hecho eso, necesitamos trabajar un poco con nuestro actualizador de estado. Así que setState va a tomar una función de actualización y básicamente solo ejecutará esa función de actualización con el estado existente y devolverá el nuevo estado, algo así como un reductor. O si has usado setState antes con React, es muy parecido a eso.
A continuación, tenemos nuestra función de búsqueda, y nuestra función de búsqueda va a ser asíncrona por ahora. Lo que hace esta función de búsqueda es, lo primero que queremos hacer es usar nuestra nueva función setState en la consulta para establecer setIsFetching en verdadero y borrar el error. Luego, en un bloque try-catch, intentaremos llamar a nuestra función de consulta, así que usaremos await aquí, obtendremos los data de la función de consulta, y luego si todo tiene éxito vamos a poner el estado de éxito y agregar nuestros data. Y luego en nuestro catch, si tenemos un error, vamos a hacer lo mismo, solo el estado de error con el error. Y finalmente, literalmente, finalmente, vamos a establecer queryPromise en nulo y query.setState vamos a establecer setIsFetching en falso.
Así que este quirky.promise aún no existe, pero lo vamos a necesitar. Así que vamos a establecer la promesa en nulo aquí arriba, desde el principio. Y lo que esto va a hacer es permitirnos comenzar a configurar algo de desduplicación. Así que si la función de consulta ya se está ejecutando o está en progreso, no queremos dispararla de nuevo. Así que vamos a usar esa propiedad query.promise para hacer algo de magia con las promesas. En lugar de hacer esta función Fetch async aquí, la vamos a envolver en otra lógica. La vamos a envolver en este bloque justo aquí. Así que si aún no hay una promesa, vamos a asignar esa promesa a una nueva promesa que viene de esta función asíncrona. Y podemos simplemente volcar toda nuestra lógica existente en esa función justo allí. Así que dice que si no hay una promesa, entonces inicia una nueva función Fetch y asígnala a la promesa. Y así que cualquier otra vez que llamemos a Fetch si ya hay una promesa, simplemente la vamos a devolver aquí mismo. Así que si no hay promesa, entonces diremos return query.promise. Y eso se encarga de nuestro problema de desduplicación, que es una forma bastante elegante y fácil de hacer eso. Queremos asegurarnos de que en el finally, cuando termine, establecemos esa promesa de consulta en nulo para que podamos dispararla de nuevo. Así que no podemos conectar esta función de creación de consultas directamente a nuestro hook useQuery. Tenemos que permitir que las consultas sean compartidas por múltiples instancias de useQuery, así que vamos a tener que crear algún soporte de suscripción para todo esto, y vamos a empezar a hacer eso en nuestra consulta, en nuestra función createQuery aquí. Voy a crear un nuevo método aquí llamado subscribe. Va a tomar un suscriptor, que por ahora es solo un objeto, y vamos a empujar eso en query.subscribers, así que voy a necesitar suscriptores aquí arriba que van a ser un array. Y luego va a devolver una función de cancelación de suscripción, que simplemente eliminará eso de la lista de suscriptores cuando lo llamemos. Y también necesitamos actualizar nuestra función setState aquí arriba para que cada vez que llamemos a setState notifiquemos a todos los suscriptores. Pasamos por ellos y llamamos a subscriber.notify. Y solo voy a mover esto aquí abajo, para mantener las cosas organizadas.
Comments