Underscore: _.wrap unterstützt keine Wrapping-Funktion mit Argument

Erstellt am 9. März 2013  ·  8Kommentare  ·  Quelle: jashkenas/underscore

Heute musste ich beim Schreiben von Code mit Unterstrich und Backbone einige Funktionen umschließen. Ich habe folgendes Beispiel auf underscorejs.org gesehen

var hello = function (name) {return "hallo:" + name; };
hallo = _.wrap (hallo, funktion (func) {
return "before" + func ("moe") + ", after";
});
Hallo();
=> 'vorher, hallo: moe, nach'

in der vorletzten Zeile
Was ist, wenn der Funktionsaufruf so ist?
Hallo ("umar");
Ich will damit sagen, dass Argumente von außen kommen.

question

Alle 8 Kommentare

Wrap erledigt das meiste bereits für Sie. Die Quelle für den Wrap ist ziemlich kurz zum Durchlesen. Das oder Sie können einen Blick auf das erweiterte Beispiel unten werfen:

var greet = function(name, language){
  var response
  if (language === "sp") {
    response = "Hola"
  } else if (language === "fr") {
    response = "Bonjour"
  } else {
    response = "Hello"
  }
  return response + " " + name
}
greet("Ted", "fr"); // => "Bonjour Ted"
greet = _.wrap(greet, function(old_greet, lang){ return old_greet("Ted", lang); } );
greet("sp"); // => "Hola Ted"

Vielen Dank für diese schnelle Antwort. Es war sehr hilfreich.
Ich verwende Backbone, um eine Unternehmens-App zu entwickeln.
view.js
var view = Backbone.View.extend ({

authorizeCreateAction: function () {
// hier zeigt "dies" an
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// Erstellungsaktion autorisieren
return _createAlert (_type);
});
},
createAlert: Funktion (Typ) {
//PROBLEM:
// Hier zeigt "this" auf [window global]
}}
});
siehe innerhalb der Funktion createAlert, als ich die Funktion createAlert direkt aufrief, zeigte sie auf die Ansicht, aber als ich die Wrapper-Funktion schrieb, zeigte sie auf [window global]
Ich möchte den Verweis darauf so ändern, dass er auf "Ansicht" verweist.

Ich bin neu im Unterstreichen, bitte ignorieren Sie, wenn die Frage irrelevant ist.
Übrigens ist der Unterstrich großartig

Sie müssen _createAlert mit einem Kontext wie unten aufrufen. Ich hoffe, das hilft. :) :)

return _createAlert.call(this, _type);

Es scheint, dass der Unterstrich _wrap nur einen Parameter unterstützt. Verwenden Sie stattdessen diesen:

fn = (Funktion (fn, vor, nach, selbst) {
Rückgabefunktion () {
if (before) before.apply (Selbst, Argumente);
var res = fn.apply (Selbst, Argumente);
if (after) after.apply (Selbst, Argumente);
return res;
}}
}) (fn, vorher, nachher)

Sie können auch teilweise für dieses Zarehb verwenden

tnx megawac, partiell dient eher zum Vorabfüllen der Argumente, die keine Vorher- und Nachher-Funktion aufrufen

Wrap wird über _.partial fyi implementiert

fn = _.partial(function(fn, before, after, self) {
    var args = _.rest(arguments, 4);
    if (before) before.apply(self,args);
    var res = fn.apply(self,args);
    if (after) after.apply(self,args);
    return res;
})(fn, before, after, this )

Das ist richtig und es wird funktionieren, aber falls jemand eine reine js-Lösung möchte, kann er meine speziell nehmen, da die Verwendung von Unterstrich in diesem Fall keinen Nutzen bringt!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

dmaicher picture dmaicher  ·  9Kommentare

danilopolani picture danilopolani  ·  5Kommentare

jdalton picture jdalton  ·  4Kommentare

clouddueling picture clouddueling  ·  3Kommentare

jezen picture jezen  ·  8Kommentare