2011-07-23 59 views
0

我在節點項目中使用now.js和Mongoose,並且無法訪問mongoose函數內的this.now對象。例如。JavaScript(node.js)變量在內部函數調用時不可訪問。 now.js

everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); //this will work 
    Project.findOne({'_id':project_id}, function(err, project){ 
    if(project){ 
     this.now.talk(); // this will not work "TypeError: Cannot call method 'bark' of undefined" 
    }; 
    }); 
}; 

回答

4

更改代碼這樣:

everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); // this will work 
    var that = this; // save 'this' to something else so it will be available when 'this' has been changed 
    Project.findOne({'_id':project_id}, function(err, project){ 
    if(project){ 
     that.now.talk(); // use local variable 'that' which hasn't been changed 
    }; 
    }); 
}; 

裏面你的內心功能,this可能是被設置到別的東西。因此,爲了保留您想要訪問的值,可以將其分配給內部函數中可用的其他局部變量。

+0

哈啊輝煌多數民衆贊成「那個」是怎麼一回事。 –

1
everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); // this will work 
    Project.findOne({'_id':project_id}, (function(tunnel, err, project){ 
    if(project){ 
     this.now.talk(); 
    }; 
    }).bind(this, "tunnel")); // overwrite `this` in callback to refer to correct `this` 
}; 

使用Function.prototype.bindthis值的值設置爲你想要

+0

是否比jfriend00建議的那樣使用'that'更好? –

+0

@beck我會稱之爲個人喜好。您還可以使用'.bind'來隧道額外的參數。 (見編輯) – Raynos

相關問題