En mi proyecto, necesitaba una funcionalidad que me permitiera no perder los datos ingresados en caso de una falla en la conexión a Internet y se me ocurrió un "Broker" muy simple que me permitiría no perder datos cuando se perdiera la conexión, sino enviarlos cuando la conexión se restablezca nuevamente. Quizás "Broker" no sea un buen nombre para él, pero no juzgues estrictamente. Quiero compartir, tal vez alguien sea útil.
Sobre el proyecto
Mi proyecto está diseñado para contabilizar los gastos e ingresos o como una versión simple de la contabilidad del hogar. Fue creado como una aplicación web progresiva, por lo que es conveniente usarlo en dispositivos móviles, así como para abrir las capacidades de notificaciones Push, acceso a la cámara para leer códigos de barras y similares. Hay una aplicación móvil similar llamada ZenMoney, pero quería algo propio y a mi manera.
El surgimiento de ideas
Trato de mantener un registro claro de gastos e ingresos, pero como a menudo se me olvida agregar las posiciones necesarias, especialmente con respecto al efectivo, tengo que hacer esto casi de inmediato cuando ocurrió la "transacción". A veces ingresé datos en el transporte público, como el metro, donde a menudo se producen pérdidas de conexión, incluso a pesar de la red Wi-Fi generalizada. Fue una pena que todo se congele y no pase nada, y luego los datos simplemente se perdieron.
La idea surgió del uso de un intermediario de colas como RabbitMQ. Por supuesto, tengo una solución más simple y no tan funcional, pero hay algo similar a sus principios. Pensé que puede guardar todo, por ejemplo, en Cache o LocalStorage como un objeto con una cola de solicitudes "insatisfechas", y cuando aparece una conexión, puede ejecutarlas de manera segura. Por supuesto, no se ejecutan en orden de prioridad, lo que, gracias al procesamiento asíncrono de solicitudes en el lenguaje JS, es aún mejor, dado que solo tiene un "suscriptor". Me encontré con algunas dificultades, tal vez incluso implementar todo esto parezca un poco torcido, pero esta es una solución que funciona. Por supuesto, se puede mejorar, pero por ahora describiré la opción "en bruto" pero funcional existente.
Empezando
¡Lo primero que pensé fue dónde almacenar los datos en ausencia de una conexión? El woker de servicio que me impuso PWA funciona bien con el caché, pero ¿es aconsejable usar el caché? Una pregunta difícil, no voy a entrar en eso. En general, decidí que LocalStorage es mejor para mí. Como LocalStorage almacena valores de tipo clave: valor, el objeto tuvo que agregarse como una cadena Json. En mi proyecto para desarrollo externo, agregué un directorio llamado QueueBroker a la carpeta de la clase
Estructura de archivo/**----**/
├── app.js
├── bootstrap.js
├── classes
│ └── QueueBroker
│ ├── index.js
│ └── Library
│ ├── Broker.js
│ └── Storage.js
├── components
/**----**/
Mi proyecto se realiza en la pila Laravel + VueJs, por lo que se requiere una cierta dependencia de la estructura del archivo. No sé cómo en tales casos es correcto llamar a sus propios directorios para clases, así que lo hice.
El archivo de índice se creó para simplemente conectar módulos de la Biblioteca anidada. Puede que no sea una solución muy elegante, pero quería hacerlo de modo que si de repente cambio de opinión acerca del uso de LocalStorage, escribiré otra clase para Almacenamiento con los mismos métodos, la pasaré al constructor del agente y usaré el otro almacenamiento sin cambiar nada.
index.js const Broker = require('./Library/Broker'); const Storage = require('./Library/Storage'); module.exports.Broker = Broker; module.exports.Storage = Storage;
Este método le permite conectar solo aquellas bibliotecas que necesito en mis scripts, por ejemplo, si necesito ambas:
import {Storage, Broker} from '../../classes/QueueBroker/index';
Para facilitarme el cambio de la clase de almacenamiento, hice un tipo de constructor para la clase Broker, en el que el objeto Storage podría pasarse como argumento, lo principal es que tiene las funciones necesarias. Sé que en ES6 podría escribir clase y constructor, pero decidí hacerlo a la antigua usanza: prototipo. Escribiré comentarios directamente por código:
Broker.js const axios = require('axios');
A continuación, necesita el objeto de almacenamiento en sí, que guardará y recuperará con éxito todo del almacenamiento
Cuando todo lo anterior esté listo, esto se puede usar a su discreción, lo uso así:
PS
Me resulta difícil hablar sobre el código, así que intenté proporcionar el código en los ejemplos lo más detallado posible con comentarios detallados. Si tiene ideas para mejorar esta solución o mejorar este artículo, me complacerá verlas en los comentarios. Tomé ejemplos de mi propio proyecto en Vue, explico esto para dejar en claro por qué mis métodos se llaman así y por qué accedo a ellos a través de
esto . No lo hago en este artículo específicamente en Vue, así que no proporciono otro código de componente, lo dejo para que lo comprenda.