Цепочка обещаний, «это» не определено

1

У моего провайдера у меня есть следующий код (упрощенный):

  initiateAPI(): Promise<any> {
      return this.method1()
        .then(this.method1)
        .then(this.method2)
        .catch(console.log);
  }

Оба метода method1 и method2 возвращают Promise следующим образом:

  method1() : Promise<any> {
    console.log("this in method 1",this);
    return new Promise((resolve, reject) => {
      this.anotherProvider.getData().then((data) => {
        if(!data) {
          reject("Data not found");
        }
        resolve(data);
      });
    });
  }

 method2() : Promise<any> {
    console.log("this in method 2",this);
    return new Promise((resolve, reject) => {
      this.thirdProvider.getData().then((data) => {
        if(!data) {
          reject("Data not found");
        }
        resolve(data);
      });
    });
  }

Первый метод (метод1) выполняется правильно, и второй метод (method2) вызывается, как и ожидалось. Проблема в том, что во втором методе this не определено.

Я также попытался объединить свои обещания следующим образом:

  initiateAPI(): Promise<any> {
      return this.method1()
        .then(() => this.method1)
        .then(() => this.method2)
        .catch(console.log);
  }

Но проблема остается прежней.

Как я могу заставить this сохранить свою ценность?

Теги:
angular
ionic-framework
ionic2
angular-promise

1 ответ

2
Лучший ответ

Методы реализуются как старомодные function функции, поэтому не как функции стрелок, а this означает, что this определяется способом вызова методов. Как вы обеспечиваете ссылку на функцию как then обратный вызов, this будет undefined (или глобальный объект в небрежной режиме).

Есть как минимум два способа сохранить this как вы этого хотите:

initiateAPI(): Promise<any> {
    return this.method1()
        .then(_ => this.method1())
        .then(_ => this.method2())
        .catch(console.log);
}

или же:

initiateAPI(): Promise<any> {
    return this.method1()
        .then(this.method1.bind(this))
        .then(this.method2.bind(this))
        .catch(console.log);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню