异步回调中未定义的类成员

时间:2019-06-28 11:57:21

标签: javascript node.js typescript request

请考虑以下内容:

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)的值:

  1. 通过getItem()方法调用
  2. 应许执行者
  3. 来自request()回调函数。

令我惊讶的是,在#3中,test未定义!

我可以理解,this在执行者/回调上下文中不是“事物”,
因为调用者无法知道对象并执行__thiscall(c ++术语)。

第一个问题:test为什么不包含在闭包中?
第二个问题:如果request回调不起作用,为什么诺言执行者呢?

请注意,尝试将lambda更改为具有相同结果的匿名函数。

谢谢。

1 个答案:

答案 0 :(得分:0)

有一个小技巧可以记住类范围。在getItem()的第一行中,只需放置一个let me = this;,然后在嵌套函数中可以使用me.test。这应该工作:)