Update: Ich weiß jetzt, dass Drossel überschüssige Funktionsaufrufe fallen lassen wird, so ist es nicht das richtige Werkzeug. Ich würde immer noch eine idiomatische Art und Weise mögen, alle Gegenstände in einer Schlange zu bearbeiten, ohne zu schnell zu gehen oder irgendwelche Gegenstände fallen zu lassen.Rate Limit Funktionsaufrufe in Typescript
Ich schreibe eine Knoten-App, die eine API mit einem Ratenlimit trifft. Ich kann Anrufe viel schneller erstellen, als ich ihnen senden darf. Ich möchte eine Warteschlange von Anrufen konsumieren, aber ohne zu schnell zu gehen oder irgendwelche von ihnen fallen zu lassen. Ich machte einen kleinen Typescript Test meine Probleme zu veranschaulichen:
import * as _ from "lodash";
let start = new Date().getTime();
function doLog(s: string) {
let elapsed = new Date().getTime() - start;
console.log(`${s} ${elapsed}`);
}
let array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
let throttled = _.throttle(doLog, 100);
array.forEach(s => throttled(s));
Ich erwartete Ausgabe zu sehen, etwa wie:
a 2
b 101
c 203
d 302
e 405
f 502
g 603
h 706
i 804
j 902
Aber stattdessen sehe ich:
a 2
j 101
einige merkwürdige Beobachtungen I‘ ve made:
- Bei 100ms Drossel, die si ze des Arrays scheint irrelevant: Ich werde das erste und letzte Element im Array drucken, ob es 2 Elemente oder 20 hat.
- Bei 1ms Drossel, drucke ich 3-6 Elemente von der Vorderseite des Arrays, und die letzte Element
Ja, das ist nicht, wofür gedrosselt ist. Siehe [die Dokumentation] (https://lodash.com/docs#throttle). Du kannst deine eigene Klasse schreiben, die das gewünschte Verhalten hat ... Ich denke nicht, dass es etwas in Lodash gibt, das damit umgehen kann. –
habe ich schon getan. Ich habe auch den Artikel von David Corbacho gelesen, der in den Dokumenten verlinkt ist. Die Dokumentation sagt "Die gedrosselte Funktion kommt mit einer Cancel-Methode zum Abbrechen verzögerter Func-Aufrufe und einer Flush-Methode, um sie sofort aufzurufen." Dieser Ausdruck "verzögerte Func Invocations" klingt sicher so, als würde er mich anrufen. Aber es klingt, als würde ich mich irren, was in Ordnung ist. Gibt es eine andere Funktion/Dienstprogramm, die ich verwenden sollte? –