Javascript (node.js) переменная недоступна для внутреннего вызова функции. Теперь

StackOverflow https://stackoverflow.com/questions/6801569

Вопрос

Я использую Now.js и Mongoose в проекте узла, и у меня возникают проблемы с доступом к объекту This. Например

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"
    };
  });
};
Это было полезно?

Решение

Измените код на это:

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 к желаемому значению

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top