Frage

Ich versuche, Funktionen in allen zu liefern pocket von Nowjs. Ich würde gerne tun _.extendaller Tasche, dh everyone.now. Aus irgendeinem Grund, den ich nicht verstehen kann, _.extend kann die Funktion auf der Clientseite nicht ordnungsgemäß bereitstellen.

Dies ist mein aktueller Code:

var _ = require("underscore"),
    everyone = require("nowjs").initialize(app);

everyone.now.foo = function() {};

_.extend(everyone.now, {
    bar: function() {}
});

console.log(everyone.now.foo); // [Function]
console.log(everyone.now.bar); // undefined

Sowohl auf dem Server als auch auf den Client -Seiten kann ich tun now.foo() Alles gut. Auf der anderen Seite, now.bar() scheitert, weil now.bar ist nicht definiert. Dies ist sowohl auf den Client- als auch auf der Server -Seite der Fall. Ich habe versucht, auf der Serverseite auf die Existenz zu suchen, wie oben in der letzten Zeile gezeigt. Diese Zeilenprotokolle protokolliert jedoch undefined.

Unterstreicht extend Funktion (offensichtlich) arbeitet an anderen Objekten, daher hat es wohl etwas mit dem "magischen Namespace" zu tun, den jetzt Js verwendet.

Wie kommt es, dass sich die Verlängerung nicht funktioniert everyone.now Und wie kann ich es zum Laufen bringen?


Bearbeiten 2: Ich habe noch mehr in Stellvertreter gegraben. Es scheint, als würde eine Eigenschaft auf einem Proxy festgelegt, indem eine Variable übergeben wird, da der Name nicht funktioniert. Ich habe meine erste Bearbeitung entfernt, weil dieser Testfall stärker eingeschränkt ist.

Warum funktioniert das nicht? Ist das ein Fehler? (Meistens frage ich das selbst, ich weiß, dass es nicht ist, aber das macht mich wirklich ahnungslos ...)

var proxy = Proxy.create({
    get: function(pr, name) {
        console.log("get called");
        return null;
    },

    set: function(pr, name, value) {
        console.log("set called");
    }
});

var key = "foo";

proxy["foo"] = "bar";
proxy[ key ] = "bar";

proxy["foo"];
proxy[ key ];

Protokollergebnis:

set called
get called
get called

Offenbar, proxy[ key ] = "bar"; verursacht nicht set auf den Stellvertreter gerufen werden. Warum ist das so?

War es hilfreich?

Lösung

Sie postete einen Blogeintrag Auf der NOWJS -Website zur Verwendung node-proxy unter Windows anstelle der nativen V8 -Implementierung mit dem --harmony_proxies Flagge.

Es schien, dass die V8 -Version, die Knoten derzeit verwendet, mehrere Fehler in Bezug auf Proxys enthält, die das seltsame Verhalten verursachten, wie in der Frage beschrieben. node-proxy, Es ist jedoch ein Modul, das Proxies ermöglicht (der Kern des "magischen Namespace" von Nowjs) ohne diese Fehler. (Die Fehler sind auch in einer neueren Version von V8 behoben, aber das würde einen benutzerdefinierten Knoten erfordern.)

Ich konnte einfach nicht herausfinden, wie ich bauen sollte node-proxy unter Windows (es ist ein .node hinzufügen Auf; Kein reines JavaScript). Im obigen Blog -Beitrag haben sie das kompilierte Modul verteilt, und alles funktioniert jetzt wie ein Zauber.

Reparieren:

  • Download das kompilierte Modul
  • Extrahieren Sie den Ordner an die node_modules Ordner und benennen es um um now
  • Führen Sie keinen Knoten mit der Proxy -Flagge aus

Bearbeiten: Knoten 0.7.0 verwendet V8 3.8.6, was dieses Problem ebenfalls löst. Einfach mit dem laufen --harmony Fahnen Sie und entfernen Sie den Verweis auf node-proxy.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top