У моего провайдера у меня есть следующий код (упрощенный):
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
сохранить свою ценность?
Методы реализуются как старомодные 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);
}