0

Перешёл на mongoDB и так получилось, что найденные данные мне нужно записать в объект this.buyer, но это не работает. Как правильно это сделать и как вызывать после записи функции?

PlayerTracker.prototype.updateBuyers = function() {
  if (!db) return;
  this.buyer = {}; // work
  this.updateData(); // work

  db.collection("buyers").findOne({uuid: this._uuid}, function(err, b) {
    if (err) throw err

    if (!b) return;

    this.buyer = b; // dont work
    this.updateData(); // dont work
  });
}
Kromster
  • 13,809
  • Не нужно делать код картинкой. Мы не обязана за вас переписывать, ради теста. – And Mar 28 '19 at 23:36

1 Answers1

2

Проще всего использовать стрелочную функцию - они используют контекст (this) своего окружения:

PlayerTracker.prototype.updateBuyers = function () {
  // ...
  db.collection("buyers").findOne({ uuid: this._uuid }, (err, b) => {
    if (err) throw err; 
    if (!b) return;
    this.buyer = b;
    this.updateData();
  });
}

p.s.: Объект экземпляра класса (прототип которого ты дополняешь) не является глобальным... как минимум, он второго уровня. Глобальный объект в Node - это global.

yar85
  • 10,940
  • Спасибо! Даже не думал, что в нём будут работать стрелочные функции) – Егор Белов Mar 29 '19 at 10:10
  • @ЕгорБелов, стрелочные функции это на самом деле те же функциональные выражения, просто без своего this - поэтому, всюду где работают "обычные" ФВ, стрелочные тоже будут работать (конечно, если юзерагент их поддерживает). – yar85 Mar 29 '19 at 10:26