2010-09-03 23 views
11

Tôi đã rối tung với việc sử dụng Node.js và CouchDB. Những gì tôi muốn có thể làm là thực hiện cuộc gọi db trong một đối tượng. Đây là kịch bản mà tôi đang nhìn vào ngay bây giờ:Làm thế nào để nghe một thay đổi biến trong 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; 

} 

Vấn đề với tất cả điều này là callback CouchDB là không đồng bộ, và "this.bar" bây giờ là trong phạm vi chức năng gọi lại, không lớp. Có ai có ý tưởng nào để hoàn thành những gì tôi muốn không? Tôi không muốn có một đối tượng xử lý mà phải làm cho db gọi cho các đối tượng, nhưng ngay bây giờ tôi thực sự bối rối với vấn đề của nó là không đồng bộ.

+2

Chào mừng bạn đến Stack Overflow, 1 cho một câu hỏi hay. –

Trả lời

6

Chỉ cần giữ một tham chiếu đến this xung quanh:

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

Tôi tin rằng OP đã sử dụng kỹ thuật 'chức năng mới ...' để tạo ra một singleton, vì vậy mã của anh ta vẫn ổn như trước đây. – James

+0

Đó không phải là singleton, anh ấy chỉ tạo ra một vật thể đơn độc. Sự hiểu biết của tôi về một singleton là nếu bạn gọi hàm tạo một lần khác, bạn sẽ có được cùng một đối tượng chính xác. –

+0

Có, kết quả 'hàm mới() {}' trong một đối tượng, nhưng chính 'hàm() {}' về bản chất là một singleton ẩn danh. – James

2

Lưu một tài liệu tham khảo để this, như vậy:

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

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

    foo.bar = dbResponse.bar;  

}); 
+0

node.js v2 (thực ra đó là V8 mới) hỗ trợ chức năng ràng buộc, vì vậy các biến bổ sung không cần thiết để truyền 'this' xung quanh:' calltoDB (..., function() {this.bar = dbResponse.bar} .bind (này)); – Andris

Các vấn đề liên quan