Javascript类,返回Promise时未定义

时间:2019-08-25 19:22:26

标签: javascript node.js typescript promise this

我有一个打字稿应用程序,它正在类中丢失“此”上下文。

此类负责设置新的Express服务器实例。

我已经设置了一个模拟代码,以说明我在哪里丢失了“此”上下文。

在这个小例子中,结果始终如预期,但是我们可以通过节点检查看到“ this”在与我的实际应用相同的位置未定义。

为什么在服务器内部未定义“ this”? 您将如何更改代码以不松散“ this”?

我尝试了多个选项,例如fn.bind(this),但始终未定义'this'。

'use strict';

 class Server {
    constructor(options) {
        this.options = options;
        this.server_id = null;
    }

    init () {
        return new Promise((resolve, reject) => {
            debugger; // this: Server

            this.startServer()
                .then(_ => {

                    debugger; // this: undefined

                    this.server_id = `ID_${this.options.port}`;

                    resolve(this);

                }, error => reject(error));
        });
    }

    startServer () {
        return new Promise((resolve, reject) => {

            function cb() {
                debugger; // this: Server
                resolve()
            }

            debugger; // this: Server

            this.listen(this.options.port, this.options.host, cb.bind(this));
        })
    }

    listen(port, host, cb) {
        debugger;
        cb()
    }
}

module.exports = Server
const Server = require('./server')

let s1 = new Server({
    port: 1111,
    host: 'localhost'
});

let s2 = new Server({
    port: 2222,
    host: 'localhost'
});

s1.init().then(() => {
    console.log(`Server S1 Started on port:${s1.options.port} ${s1.server_id}`);
});

s2.init().then(() => {
    console.log(`Server S2 Started on port:${s2.options.port} ${s2.server_id}`);
});

预期结果:

  • 服务器S1在端口1111 ID_1111上启动
  • 服务器S2在端口2222 ID_2222上启动

真实应用中返回了什么:

  • 服务器S1在端口2222 ID_2222上启动
  • 服务器S2在端口2222 ID_2222上启动

我无法发布图片:

更新

Chrome和Vscode都失去了“此”上下文

Vscode debugger This undefined  Chrome debugger This undefined

上面的代码不是打字稿应用程序的转译版本,它是打字稿应用程序面临的相同问题的模拟,您无法使用此代码复制该问题(f *** g巫术),但是两者都在Chrome中和Vscode,您可以看到startServer()解析后如何丢失“此”上下文。

我将发布始终面对该问题的打字稿应用程序(丢失了“ this”的上下文,但更糟糕的是,它混淆了...)

非常感谢您的回复。

0 个答案:

没有答案