在我的提供者中,我有以下代码(简化):
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);
});
});
}
第一种方法( method1 )正确执行,并按预期调用第二种方法( method2 )。问题是第二种方法中this
未定义。
我还尝试将承诺链接如下:
initiateAPI(): Promise<any> {
return this.method1()
.then(() => this.method1)
.then(() => this.method2)
.catch(console.log);
}
但问题仍然存在。
如何让this
保持其价值?
答案 0 :(得分:2)
方法是作为老式的function
函数实现的,因此不是箭头函数,这意味着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);
}