2010-09-03 3 views
11

Я общался с использованием Node.js и CouchDB. То, что я хочу сделать, это сделать вызов db внутри объекта. Вот сценарий, который я смотрю прямо сейчас:Как прослушивать изменение переменной в 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; 

} 

Проблема со всем этим, что обратный вызов CouchDB является асинхронным, и «this.bar» теперь в пределах функции обратного вызова, не класс. Есть ли у кого-нибудь идеи для достижения того, что я хочу? Я бы предпочел не иметь объект-обработчик, который должен делать вызовы db для объектов, но прямо сейчас я очень сильно обеспокоен тем, что он является асинхронным.

+2

Добро пожаловать на переполнение стека, +1 за хороший вопрос. –

ответ

6

Просто держать ссылку на this вокруг:

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

Я считаю, что OP собирался использовать «новую функцию ...» для создания синглтона, поэтому его код был в порядке. – James

+0

Это не синглтон, он просто создает одинокий одинокий объект. Мое понимание singleton заключается в том, что если вы вызовете конструктор в другое время, вы получите тот же самый объект. –

+0

Да, 'new function() {}' приводит к объекту, но 'function() {}' сам по себе является анонимным одноэлементным. – James

2

Сохранить ссылку на this, например, так:

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

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

    foo.bar = dbResponse.bar;  

}); 
+0

node.js v2 (фактически это новый V8) поддерживает привязку функций, поэтому дополнительные переменные не нужны для передачи 'this' around:' calltoDB (..., function() {this.bar = dbResponse.bar} .bind (это)); ' – Andris

Смежные вопросы