Hola chicos, ¿alguien puede ayudarme rápidamente aquí?
Tengo un intervalo para una presentación de diapositivas en una función y quiero borrarlo de otra función sin usar ámbitos globales, ya que sé que es una mala práctica.
¿Puede alguien amablemente ayudar aquí, por favor?
function beginSlideshow() { var interval = setInterval(function () { //Slideshow content here } function revertSlideshow() { clearInterval(interval); }Tienes que guardar el mango del temporizador en algún lugar . :-)
Tienes muchas opciones:
Podrías usar módulos. Entonces, una declaración de interval de nivel superior no sería global, solo sería accesible para el módulo:
let interval = 0; export function beginSlideshow() { interval = setInterval(function () { //Slideshow content here }, someValue); } export function revertSlideshow() { clearInterval(interval); interval = 0; }Concepto similar al módulo anterior, pero sin usar módulos:
const { beginSlideshow, revertSlideshow } = (() => { let interval = 0; function beginSlideshow() { interval = setInterval(function () { //Slideshow content here }, someValue); } function revertSlideshow() { clearInterval(interval); interval = 0; } return { beginSlideshow, revertSlideshow }; })()); Podría hacer que este sea el problema de la persona que llama a beginSlideshow devolviendo la función para detenerlo:
function beginSlideshow() { const interval = setInterval(function () { //Slideshow content here }, someValue); return () => { clearInterval(interval); }; }La persona que llama lo usaría así:
const revertSlideshow = beginSlideShow(); // ... revertSlideshow();Otra forma de almacenarlo en el alcance de la persona que llama es envolverlo en una clase y hacer que el identificador sea una propiedad de datos:
class Slideshow { interval = 0; begin() { this.interval = setInterval(/*...*/); } revert() { // I'd call it "end" clearInterval(this.interval); this.interval = 0; } }