es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intentando usar setInterval para crear una función de regulación sin éxito.

Estoy intentando devolver una función que solo invoque una función de retorno ‘func’ una vez cada ‘wait’ milisegundos.

Las llamadas adicionales a la función de retorno ‘func’ dentro del período ‘wait’ NO deben ser invocadas ni encoladas.

Esto es lo que tengo hasta ahora…

function throttle(func, wait) {
    function inner(...args) {
        setInterval(func(...args), wait);
    }
    return inner;
}

Cuando ejecuto el código a través del algoritmo de prueba, obtengo los siguientes errores:

  1. “las funciones limitadas solo deben poder ser llamadas nuevamente después del tiempo especificado”

Aquí está el algoritmo de prueba…

let counter = 0;
const incr = () => counter++;
const throttledIncr = throttle(incr, 32);
throttledIncr();
throttledIncr();
setTimeout(() => {
  expect(counter).to.eql(1);
  throttledIncr();
  setTimeout(() => {
    expect(counter).to.eql(2);
    done();
  }, 32);
}, 32);
  1. “las funciones limitadas devuelven su valor”

Aquí está el algoritmo de prueba…

let counter = 0;
const incr = () => ++counter;
const throttledIncr = throttle(incr, 32);
const result = throttledIncr();
setTimeout(() => {
  expect(result).to.eql(1);
  expect(counter).to.eql(1);
  done();
}, 64);
  1. “las funciones limitadas llamadas repetidamente deben cumplir con las limitaciones de tiempo”

Aquí está el algoritmo de prueba…

let counter = 0;
const incr = () => ++counter;
const throttledIncr = throttle(incr, 64);
const results = [];
const saveResult = () => results.push(throttledIncr());
saveResult();
saveResult();
setTimeout(saveResult, 32);
setTimeout(saveResult, 80);
setTimeout(saveResult, 96);
setTimeout(saveResult, 180);
setTimeout(() => {
  expect(results[0]).to.eql(1);
  expect(results[1]).to.be(undefined);
  expect(results[2]).to.be(undefined);
  expect(results[3]).to.eql(2);
  expect(results[4]).to.be(undefined);
  expect(results[5]).to.eql(3);
  done();
}, 192);

Mis preguntas sobre cada caso:
1. ¿Cómo evito que la función sea llamada nuevamente?
2. ¿Por qué MI función no devuelve un valor? No puedo deducir qué o cómo devolver un valor con el algoritmo de prueba dado.
3. ¿Qué significa realmente “las funciones limitadas llamadas repetidamente deben cumplir con las limitaciones de tiempo”? Esto parece contradictorio con el primer error. No se menciona ninguna configuración de límite de tiempo, así que no creo que el uso de setTimeout aquí sea lo que quieren decir…

Tags:  , , ,

Answer

  1. Avatar for davy.ai
    1. Para evitar que la función sea llamada de nuevo antes de que finalice el período de espera, es necesario utilizar un temporizador y eliminarlo cuando se llame a la función. Aquí tienes una versión actualizada de la función throttle:
    function throttle(func, wait) {
      let timerId = null;
      return function(...args) {
        if (!timerId) {
          timerId = setTimeout(() => {
            func(...args);
            timerId = null;
          }, wait);
        }
      };
    }
    
    1. El problema con la implementación actual es que la función setInterval no devuelve el valor de la función func, simplemente programa su ejecución de forma repetida. Para devolver el valor de func, es necesario modificar la función throttle para que devuelva una función que retorne el resultado de la función func. Aquí tienes una versión actualizada:
    function throttle(func, wait) {
      let timerId = null;
      return function(...args) {
        if (!timerId) {
          let result = func(...args);
          timerId = setTimeout(() => {
            timerId = null;
          }, wait);
          return result;
        }
      };
    }
    
    1. El tercer test comprueba si la función throttle solo es llamada una vez dentro del período de espera, ignorando cualquier llamada subsiguiente dentro de ese período. La prueba utiliza setTimeout para simular estas llamadas que ocurren con el tiempo. El propósito de la prueba es asegurar que la función throttle limite correctamente la frecuencia de las llamadas a la función.

Comments are closed.