我有一个打字稿应用程序,它正在类中丢失“此”上下文。
此类负责设置新的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}`);
});
预期结果:
真实应用中返回了什么:
我无法发布图片:
Chrome和Vscode都失去了“此”上下文
Vscode debugger This undefined Chrome debugger This undefined
上面的代码不是打字稿应用程序的转译版本,它是打字稿应用程序面临的相同问题的模拟,您无法使用此代码复制该问题(f *** g巫术),但是两者都在Chrome中和Vscode,您可以看到startServer()解析后如何丢失“此”上下文。
我将发布始终面对该问题的打字稿应用程序(丢失了“ this”的上下文,但更糟糕的是,它混淆了...)
非常感谢您的回复。