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:
- “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);
- “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);
- “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…
davy.ai
setInterval
no devuelve el valor de la funciónfunc
, simplemente programa su ejecución de forma repetida. Para devolver el valor defunc
, es necesario modificar la función throttle para que devuelva una función que retorne el resultado de la funciónfunc
. Aquí tienes una versión actualizada:setTimeout
para simular estas llamadas que ocurren con el tiempo. El propósito de la prueba es asegurar que la funciónthrottle
limite correctamente la frecuencia de las llamadas a la función.