Solution for throttle decorator is incorrect. (Decorators and forwarding, call/apply)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript
- Área
- documentation
Línea de trabajo
Empieza con el ejemplo del throttle decorator en la sección enlazada del tutorial «Decorators and forwarding, call/apply» y reproduce el snippet de bucle estrecho proporcionado. Compara el comportamiento actual con el pull request #2844; se considera terminado cuando el ejemplo ya no reduce el bucle únicamente a los valores primero y último.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Original code: https://javascript.info/call-apply-decorators#throttle-decorator
Here's a small code snippet to show where it doesn't work.
function f(a) { console.log(a) };
let g = throttle(f, 1000);
for(let i = 0; i < 1e8; i++) g(i);
Expected Output
1, 249204, 452039, ... , 9999999 (These are random increasing numbers)
Output
1, 9999999
Why does it fail?
function wrapper() {
if (isThrottled) { // (2)
savedArgs = arguments;
savedThis = this;
return;
}
isThrottled = true;
func.apply(this, arguments); // (1)
setTimeout(function() {
isThrottled = false; // (3)
if (savedArgs) {
wrapper.apply(savedThis, savedArgs);
savedArgs = savedThis = null;
}
}, ms);
}
In above, isThrottled = false assignment is done inside setTimeout callback. However, only one callback is pushed into task queue and it isn't executed until stack is empty (for loop has to be completed).
isThrottled is always true => setTimeout isn't called => one callback (that was registered for initial false isThrottled) => cb executed at end and outputs last value => output: 1, 9999999.
Correct Solution: https://github.com/javascript-tutorial/en.javascript.info/pull/2844
This PR giving an alternative solution.
- Lenguaje dominante
- HTML
- Estrellas
- 25.5k
- Forks
- 4k
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de javascript-tutorial/en.javascript.info
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
-
Keyboard events: keydown filtering example can't block IME-composed input (Korean/Japanese/Chinese) Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
javascript-tutorial/en.javascript.info#3978 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Todos los issues de javascript-tutorial/en.javascript.info
Issues similares
-
triage
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
feature pydanty:is-working
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
pydantic/pydantic-ai#8647 ·
-
Add date o "release information" Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
Add more to the documentation Abierto:watch: Not Triaged dotnet-fsharp/svc
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100