请考虑以下内容:
import request = require("request");
class CFoo {
test:number;
async getItem(): Promise<number> {
var requestOptions = {
method: 'GET',
url: `https://www.google.com`,
headers: {
'cache-control': 'no-cache'
}
};
console.log('number is ' + this.test);
return new Promise<number>((resolve, reject)=>{
console.log('in promise... number is ' + this.test);
request(requestOptions, function (error, response, body) {
console.log('in async... number is ' + this.test);
if (error) throw new Error(error);
resolve(this.test);
});
});
}
constructor() {
this.test = 555;
}
}
var foo:CFoo = new CFoo();
foo.getItem().then(val=>console.info('returned ' + val));
您会注意到,我在以下三种情况下读取了测试(555)的值:
getItem()
方法调用request()
回调函数。 令我惊讶的是,在#3中,test
未定义!
我可以理解,this
在执行者/回调上下文中不是“事物”,
因为调用者无法知道对象并执行__thiscall
(c ++术语)。
第一个问题:test
为什么不包含在闭包中?
第二个问题:如果request
回调不起作用,为什么诺言执行者呢?
请注意,尝试将lambda更改为具有相同结果的匿名函数。
谢谢。
答案 0 :(得分:0)
有一个小技巧可以记住类范围。在getItem()
的第一行中,只需放置一个let me = this;
,然后在嵌套函数中可以使用me.test
。这应该工作:)