Estoy haciendo una tienda esbelta personalizada envolviendo una tienda de escritura esbelta.
Quiero detectar cuando esa tienda no está suscrita por ningún componente; cuando el número de suscripciones es 0
Mi objetivo es limpiar algunos recursos externos pesados (websockets) que estaban vinculados a la tienda personalizada cuando nadie la estaba usando.
Actualmente, estoy contando las suscripciones y cancelaciones de suscripciones ajustando el método subscribe(). Funciona como se esperaba . Pero me parece un truco desagradable.
Mi pregunta: ¿Existe una forma estándar/limpia de lograr este comportamiento en Svelte?
Si no, ¿puede alguien con más experiencia en Javascipt y Svelte confirmar si esto es legítimo?
Demostración en: https://svelte.dev/repl/f4e24fb5c56f457a94bf9cf645955b9f?version=3.43.1
import { writable } from 'svelte/store'; // Instanciate the store export let store = MakeStore(); // By design, I want a function that returns a custom svelte store export function MakeStore(initialValue = null) { const { subscribe, set, update } = writable(initialValue); let subscribercount = 0; let wsubscribe = function (run, callback) { subscribercount++; console.log("subscribercount++", subscribercount); let wunsubscribe = subscribe(run, callback); return () => { subscribercount--; console.log("subscribercount--", subscribercount); if (subscribercount == 0) { // ------------------------------- // Free up resources // I want a clean way to get here // ------------------------------- console.log("Cleaning up..."); } return wunsubscribe(); } } // Some external calls here let store = { subscribe: wsubscribe, set: newvalue => { set(newvalue); // Some external calls here }, update: update }; // Some external calls here return store; }
Sí, está integrado en la tienda y documentado aquí .
de los documentos
Si se pasa una función como segundo argumento, se llamará cuando el número de suscriptores pase de cero a uno (pero no de uno a dos, etc.). A esa función se le pasará una función establecida que cambia el valor de la tienda. Debe devolver una función de parada que se llama cuando el recuento de suscriptores pasa de uno a cero.
por lo que haría por ejemplo:
const count = writable(0, () => { console.log('got a subscriber'); return () => console.log('no more subscribers'); });