Question

Je suis en train de fournir des fonctions dans le pocket de chacun des nowjs. Je voudrais le faire en _.extending la poche de tout le monde, à savoir everyone.now. Pour une raison que je ne comprends pas, _.extend ne fournit pas correctement la fonction du côté client.

Ceci est mon code actuel:

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

Sur les deux côtés serveur et client, je peux faire now.foo() très bien. D'autre part, now.bar() échoue parce que now.bar n'est pas défini. Tel est le cas aussi bien du côté client et serveur. J'ai essayé de vérifier l'existence du côté serveur, comme indiqué ci-dessus sur la dernière ligne. Cependant, cette ligne enregistre undefined.

La fonction extend (évidemment) de Souligné fonctionne sur d'autres objets, donc je suppose qu'il a quelque chose à voir avec le « espace de nom magique » qui utilise des nowjs.

Comment s'étendre ne fonctionne pas avec everyone.now et comment puis-je obtenir au travail?


Edit 2: Je creusa un peu plus dans les procurations. Il semble que définir une propriété sur un proxy en passant une variable comme son nom ne fonctionne pas. J'ai enlevé mon premier montage parce que ce testcase est plus rétréci vers le bas.

Pourquoi cela ne fonctionne pas? Est-ce un bug? (La plupart du temps je demande moi-même, je sais que ce n'est pas, mais ce qui est vraiment me fait désemparés ...)

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 ];

Résultat Log:

set called
get called
get called

Apparemment, proxy[ key ] = "bar"; ne provoque pas set à appeler sur le proxy. Pourquoi?

Était-ce utile?

La solution

posté une entrée de blog sur le site de NowJS sur la façon de utilisation node-proxy sous Windows, au lieu de la mise en œuvre du V8 natif en utilisant le drapeau --harmony_proxies.

Il est apparu que la version V8 utilise actuellement ce nœud contient plusieurs bugs en ce qui concerne les procurations, qui étaient à l'origine du comportement bizarre comme indiqué dans la question. node-proxy, cependant, est un module qui permet proxies (le noyau du "espace magique" de NowJS) sans ces bugs. (Les bugs sont corrigés dans une version plus récente de V8 ainsi, mais cela nécessiterait une version personnalisée du nœud.)

je ne pouvais comprendre comment construire node-proxy sous Windows (c'est un addon .node, pas un pur JavaScript). Dans le blog ci-dessus ils ont distribué le module compilé, et tout fonctionne maintenant comme un charme.

Pour résoudre:

  • Télécharger le module compilé
  • Extraire le dossier dans le dossier node_modules et renommez-le à now
  • Ne pas exécuter nœud avec le drapeau proxy

Modifier Noeud 0.7.0 utilisations V8 3.8.6 qui résout également ce problème. Il suffit de courir avec le drapeau --harmony et de supprimer la référence à node-proxy.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top