this.ИМЯ_ФУНКЦИИ is not a function

299
14 мая 2021, 01:40

Есть класс, в котором есть 3 функции. Две из них должны возвратить значение. Не получается вызвать функции getUsername(arg) и getTotal(arg) внутри функции getStats(callback). Получаю ошибку "TypeError: this.getUsername is not a function"

Но функция успешно выполняется в теле класса.

В чем причина не выполнения функций? Имена функций менял, не помогло. Выполняю на NodeJS.

const colors = require('colors');

function Stats(collection, group_id) {
  this.collection = collection;
  this.group_id = group_id;
  this.empty = {
    _id: null,
    usernames: [],
    titles: [],
    members: {
      total: [],
      joined: [],
      joined_by_link: [],
      added: [],
      leaved: [],
      kicked: []
    },
    admins: [],
    bots: [],
    group_pics: [],
    pins: [],
    full_chat_last_date: null
  };
  this.getUsername = function (group) {
    return null;
  };
  this.getTotal = function (group) {
    return null;
  };
  this.getStats = function (callback) {
    //делает запрос к таблице
    // если получает строку, заменяет информацию this.Stats
    // если нет, оставляет прежней
    this.collection.find({}).toArray(function(err, groups) {
      for (let group of groups) {
        if (group["_id"] == this.group_id) {
          //Вычислить значения для статов группы
          this.stats_light = {
            username: null,//this.getUsername(group), - тут не работает
            title: group.titles[group.titles.length-1].value,
            total: null,//this.getTotal(group), - тут не работает
            admins: group.admins[group.admins.length-1].value.length,
            bots: group.bots[group.bots.length-1].value.length
          }
          console.log(colors.yellow("callback"));
          callback(group, stats_light);
          return;
        }
      }
      console.log(colors.yellow("callback NOTHING"));
      callback(this.empty);
      return;
      if (err) console.log(colors.red(err));
    });
  };
  //------------------------------
  //Тут работает
  let e = this.getUsername(2);
  //------------------------------
}
exports.Stats = Stats;
Answer 1

Внутри function(err, groups) { другой контекст.

var that = this;
this.collection.find({}).toArray(function(err, groups) {
  for (let group of groups) {
    if (group["_id"] == this.group_id) {
      //Вычислить значения для статов группы
      this.stats_light = {
        that.getUsername(group), // тут работает
READ ALSO
Анимация спрайтов не один раз

Анимация спрайтов не один раз

Я хотела сделать так, чтобы вся информация о спрайте хранилась в объекте и функцию отрисовки можно было бы использовать много раз не только...

123
Отрисовка картинок в canvas

Отрисовка картинок в canvas

Я хочу сделать,чтобы функцию draw можно было бы применять много раз с разными картинками, но у меня почему-то не выходитМожет это особенности...

100
window.width() 1730. хотя браузер развернут в fullscreen

window.width() 1730. хотя браузер развернут в fullscreen

консоль выдает 1730 ширину окна браузера в фулл скринеscreen

101