2010-09-03 47 views
11

He estado jugando con el uso de Node.js y CouchDB. Lo que quiero poder hacer es hacer una llamada a DB dentro de un objeto. Aquí es el escenario que estoy viendo en este momento:¿Cómo escuchar un cambio variable en Javascript?

var foo = new function(){ 
    this.bar = null; 

    var bar; 

    calltoDb(... , function(){ 

     // what i want to do: 
     // this.bar = dbResponse.bar; 

     bar = dbResponse.bar;  

    }); 

    this.bar = bar; 

} 

El problema con todo esto es que la devolución de llamada CouchDB es asíncrona, y "this.bar" está ahora en el ámbito de la función de devolución de llamada, no se la clase. ¿Alguien tiene alguna idea para lograr lo que quiero? Preferiría no tener un objeto controlador que tenga que hacer las llamadas a bases de datos para los objetos, pero en este momento estoy realmente perplejo con el tema de que sea asincrónico.

+2

Bienvenido a desbordamiento de pila, 1 para una buena pregunta. –

Respuesta

6

Hemos de tener una referencia a la this en torno a:

function Foo() { 
    var that = this; // get a reference to the current 'this' 
    this.bar = null; 

    calltoDb(... , function(){ 
     that.bar = dbResponse.bar; 
     // closure ftw, 'that' still points to the old 'this' 
     // even though the function gets called in a different context than 'Foo' 
     // 'that' is still in the scope and can therefore be used 
    }); 
}; 

// this is the correct way to use the new keyword 
var myFoo = new Foo(); // create a new instance of 'Foo' and bind it to 'myFoo' 
+1

Creo que OP estaba buscando la técnica 'nueva función ...' para crear un singleton, por lo que su código estaba bien como estaba. – James

+0

Eso no es un singleton, solo está creando un solo objeto solitario. Mi comprensión de un singleton es que si llamas al constructor en otro momento, obtienes exactamente el mismo objeto. –

+0

Sí, la 'nueva función() {}' da como resultado un objeto, pero 'function() {}' en sí misma es esencialmente un singleton anónimo. – James

2

Guardar una referencia a this, así:

var foo = this; 
calltoDb(... , function(){ 

    // what i want to do: 
    // this.bar = dbResponse.bar; 

    foo.bar = dbResponse.bar;  

}); 
+0

node.js v2 (en realidad es el nuevo V8) admite el enlace de función, por lo que no se necesitan variables adicionales para pasar 'this' alrededor:' calltoDB (..., function() {this.bar = dbResponse.bar} .bind (esto)); ' – Andris

Cuestiones relacionadas