Solution for throttle decorator is incorrect. (Decorators and forwarding, call/apply)
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- javascript
- Bereich
- documentation
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.
Beschreibung
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.
- Vorherrschende Sprache
- HTML
- Sterne
- 25.5k
- Forks
- 4k
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus javascript-tutorial/en.javascript.info
-
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 88/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 92/100
-
Keyboard events: keydown filtering example can't block IME-composed input (Korean/Japanese/Chinese) Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
javascript-tutorial/en.javascript.info#3978 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Alle Issues in javascript-tutorial/en.javascript.info
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
palladius/rails8-app-on-gcp#145 ·
-
NeedsTriage
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
-
error Offen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
-
textual definition
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
geneontology/go-ontology#32653 ·