Pregunta

Estoy tratando de proporcionar funciones en todos pocket de ahorajs. Me gustaría hacerlo por _.extenden el bolsillo de todos, es decir everyone.now. Por alguna razón que no puedo entender, _.extend no puede proporcionar correctamente la función en el lado del cliente.

Este es mi código actual:

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

En los lados del servidor y del cliente, puedo hacer now.foo() bien. Por otra parte, now.bar() falla porque now.bar no está definido. Este es el caso tanto en los lados del cliente como en el servidor. Traté de verificar la existencia en el lado del servidor, como se muestra arriba en la última línea. Sin embargo, esta línea registra undefined.

Subrayado extend La función (obviamente) funciona en otros objetos, así que supongo que tiene algo que ver con el "espacio de nombres mágico" que ahora usa ahora.

¿Cómo es que extender no funciona con everyone.now ¿Y cómo puedo hacer que funcione?


Editar 2: Excavé un poco más en los proxies. Parece que establecer una propiedad en un proxy al pasar una variable ya que su nombre no funciona. Eliminé mi primera edición porque esta prueba de prueba está más reducida.

¿Por qué esto no funciona? ¿Es esto un error? (La mayoría de las veces me pregunto esto yo mismo, sé que no lo es, pero esto realmente me está dejando sin idea ...)

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

Resultado del registro:

set called
get called
get called

Aparentemente, proxy[ key ] = "bar"; no causa set ser llamado al poder. ¿Porqué es eso?

¿Fue útil?

Solución

Ellos Publicado una entrada de blog En el sitio web de Nowjs sobre cómo usar node-proxy en Windows, en lugar de la implementación de V8 nativo utilizando el --harmony_proxies bandera.

Parecía que la versión V8 que el nodo utiliza actualmente contiene varios errores con respecto a los proxies, que estaban causando el comportamiento extraño como se describe en la pregunta. node-proxy, sin embargo, es un módulo que permite proxies (el núcleo del "espacio de nombres mágico" de los nowjs) sin que Esos errores. (Los errores también se solucionan en una versión más nueva de V8, pero eso requeriría una compilación personalizada de nodo).

Simplemente no pude entender cómo construir node-proxy En Windows (es un .node Añadir; No es un JavaScript puro). En la publicación de blog anterior, distribuyeron el módulo compilado, y todo ahora funciona como un encanto.

Arreglar:

  • Descargar el módulo compilado
  • Extraiga la carpeta al node_modules carpeta y cambie el nombre a now
  • No ejecute el nodo con la bandera proxy

Editar: El nodo 0.7.0 usa V8 3.8.6 que también resuelve este problema. Solo corre con el --harmony bandera y elimine la referencia a node-proxy.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top