javascript-tutorial / javascript-tutorial/en.javascript.info
Solution for throttle decorator is incorrect. (Decorators and forwarding, call/apply)
Personne n'a encore pris cette issue.
- Langage dominant
- HTML
- Étoiles
- 25.5k
- Forks
- 4k
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
Original code: https://javascript.info/call-apply-decorators#throttle-decorator
Here's a small code snippet to show where it doesn't work.
```js
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?
```js
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.
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par l’exemple de throttle decorator dans la section liée du tutoriel « Decorators and forwarding, call/apply » et reproduisez le snippet de boucle serrée fourni. Comparez le comportement actuel avec la pull request #2844 ; le travail est terminé lorsque l’exemple ne réduit plus la boucle aux seules première et dernière valeurs.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- javascript
- Domaine
- documentation
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 35/100