johnymkp
@johnymkp

Почему код внутри промиса работает, хотя this там undefined?

Привожу фрагмент класса, вопросы прямо в коде + пояснение к ним - после кода:
Фрагмент класса
export class Database {

  constructor(config) {
    this.config = config;
  }

  init() {
    return new Promise((resolve, reject) => {
      const dbname = this.config.dbname;  // 1) Почему this тут undefined?
      const version = this.config.version;  // 2) Почему, несмотря на это, dbname и version заполняются корректно?
      debugger;
      const openRequest = indexedDB.open(dbname, version);

      openRequest.onupgradeneeded = (event) => {
        debugger;
        this.database = openRequest.result;  // 3) Почему this тут IDBOpenDBRequest?
        this.createStorages();  // 4) Почему при этом вызывается метод createStorages() класса?
        resolve(true);
      }
    })
  }

  private createStorages() {
    debugger;
    this.config.storages.forEach(s => {
      if (!this.database.objectStoreNames.contains(s.name)) {
        this.database.createObjectStore(s.name, s.settings);
      }
    });
  }

  // Остальная часть класса
}

// Использование класса
const database = new Database(idbConfig);
database.init();


1) Не понимаю, почему здесь this получается undefined? Ведь в лямбдах this становится такой же, как this из внешнего блока в момент создания лямбды. Я вызываю метод init на экземпляре database, значит this в init указывает на этот экземпляр. Лямбда создается внутри init, перед тем как отправиться в промис, значит хотя бы на строчке `const dbname = this.config.dbname;` this должен указывать на экземпляр database. Но в консоли браузера отображается как undefined.
2) Несмотря на то, что this якобы undefined, переменные заполняются корректно. Т.е. как будто бы this все же указывает на экземпляр.
3) Здесь тоже не понятно, почему this получается IDBOpenDBRequest. Исходя из 1), this в промисовской лямбде должен указывать на экземпляр. Значит лямбда под событие onupgradeneeded берет this из внешней лямбды, а значит и в событийной лямбде this должен указывать на экземпляр.
4) Тем более не понятно, как может вызываться метод createStorages(), если this якобы указывает на IDBOpenDBRequest?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
> 1) Почему this тут undefined?
Это неправда

Вы используете стрелочную функцию поэтому this тут будет такой же как в init, т.е. database.

> 3) Почему this тут IDBOpenDBRequest?
Опять же неправда

> 4) Почему при этом вызывается метод createStorages() класса?
См. выше

ПС возможно вы что-то не так или не туда смотрите в дебаггере
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы