Переменная JavaScript (node.js) недоступна при внутреннем вызове функции. now.js
Я использую now.js и Mongoose в проекте узла, и у меня возникают проблемы с доступом к объекту this.now внутри функции mongoose. Например
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"
};
});
};
2 ответа
Решение
Измените код на это:
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
вероятно, настраивается на что-то другое. Таким образом, чтобы сохранить значение, к которому вы хотите получить доступ, вы присваиваете его другой локальной переменной, которая будет доступна во внутренней функции.
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.bind
установить значение this
на значение, которое вы хотите