In Javascript (Node.js-Kontext) verwende ich Function.prototype.bind
regelmäßig: bind
ermöglicht das Ändern des Aufrufkontexts und optional das Bereitstellen zusätzlicher vorangestellter Argumente.
Gibt es Empfehlungen für Anhängen Argumente? Bei einigen Gelegenheiten bin ich auf die Notwendigkeit gestoßen, in Node.js eher anzuhängen als vorzugeben, damit ich das Funktionssignaturmuster einhalten kann.
Nun zu einem halb praktischen und vereinfachten Beispiel; Ich verwende die eachSeries
Methode asynchronen Moduls .
Zuerst eine Implementierung, die den Callback umschließt (funktionierend, aber weit weg):
%Vor%Und jetzt etwas kürzer:
%Vor% Im zweiten Beispiel wird err
von eachSeries
s asyncCallback
Callback übernommen, während something
auf andere Weise zur Verfügung gestellt wird. Um dies zu verdeutlichen, möchte ich bindAppend
von dem "kürzeren" Beispiel ersetzen, das das funktionale Äquivalent von function finished
im "längeren" Beispiel hätte.
Vielleicht ist mein Design fehlerhaft und muss überarbeitet werden oder dies ist nur ein weiterer Fall einer vorzeitigen Optimierung. Die Funktion, die ich suche, könnte jedoch die folgenden Vorteile bieten:
Eine Antwort wäre, meine eigene aus einem gegabelten Function.prototype.bind Polyfill zu rollen. Ich suche jedoch nach einer nativen Implementierung, die ich nicht sehe, nach einer nativen Umgebung oder nach einem Utility-Modul, das die harte Arbeit bereits erledigt hat (Optimierung, Tests usw.). Zu Ihrer Information: Eine andere Lösung als die erstgenannte würde tatsächlich den Merkmalsvorteil Nr. 2 verschlechtern.
Aus Gründen der Wartbarkeit würde ich zu Function
keine Methode hinzufügen, um dies zu erreichen. Die anderen Antworten auf die Frage enthalten zwei Implementierungen von Function.prototype.bindAppend
, die nicht miteinander kompatibel sind. Stellen Sie sich vor, Sie würden Ihr eigenes bindAppend
erstellen und dann Ihre Anwendung mit einer Menge Code verwenden, dessen Autor sich dazu entschieden hat, dasselbe zu tun, aber eine Implementierung verwendet, die mit Ihrer nicht kompatibel ist.
Polyfills sind insofern gut, als sie darauf abzielen, eine fehlende Funktion nach einem bestimmten Standard auszufüllen. Ein Polyfill für Function.prototype.bind
zum Beispiel kann nicht frei von ECMA-262, 5. Ausgabe, abweichen. Wenn es abweicht, dann ist es wohl "fehlerhaft" und sollte durch eine Implementierung ersetzt werden, die nicht vom Standard abweicht. Wenn man Methoden implementiert, die nicht durch einen Standard definiert sind, gibt es keine solche Einschränkung.
Die folgende Benchmarking-Suite zeigt den Unterschied zwischen verschiedenen Möglichkeiten, das Ergebnis in der Frage zu erreichen.
%Vor%Ausgabe:
%Vor%Anmerkungen:
Der Aufruf von dump
dump zeigt an, was der letzte Callback ist, wenn kein Fehler auftritt.
Wenn es keinen Fehler gibt, ruft mpm% bindAppend
implementation callback
mit nur einem Parameter auf, der den Wert "foo"
hat. Dies ist ein sehr unterschiedliches Verhalten gegenüber dem ursprünglichen function finished(err) { callback(err,something);}
Callback, den es ersetzen soll.
Alles ist schneller als mpm's bindAppend
.
Ich würde die addErr, multi param
Implementierung nicht verwenden. Ich habe es dort hingelegt, um zu prüfen, wie dieser Ansatz funktioniert.
Die Funktionen addErr
sind schneller als bindAppend
, auf Kosten der Flexibilität. Sie fügen dem Rückruf nur einen Parameter hinzu.
Am Ende des Tages würde ich höchstwahrscheinlich die addErr, switch
-Implementierung mit einer ausreichend großen Anzahl von Fällen verwenden, um die Anforderungen meines Codes zu erfüllen. Wenn ich etwas mit absoluter Flexibilität benötige, würde ich für einige wenige Fälle etwas verwenden, das ähnlich wie bindAppend
ist, aber nicht als Methode für Function
.
Tags und Links javascript node.js