javascript-tutorial / javascript-tutorial/en.javascript.info

Solution for throttle decorator is incorrect. (Decorators and forwarding, call/apply)

Offen
#3,613 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
HTML
Sterne
25.5k
Forks
4k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginne mit dem Beispiel für den throttle decorator im verlinkten Tutorialabschnitt „Decorators and forwarding, call/apply“ und reproduziere das bereitgestellte Snippet für die enge Schleife. Vergleiche das aktuelle Verhalten mit Pull Request #2844; abgeschlossen ist die Aufgabe, wenn das Beispiel die Schleife nicht mehr auf nur die ersten und letzten Werte reduziert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript
Bereich
documentation
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.