今天的工作内容有点头疼,主要还是继续维护了下去房间模式的字幕,优化了长链接模块的代码,删除了原先部分逻辑。其中影响比较大的是初始化的逻辑,把我彻底搞傻了。由于需要检查 Token 的有效性,改成了异步函数,导致外部实例化的过程中,this.client
的值不会立即被初始化,我没注意到这个问题,导致出现了异常,改了一段时间。
class Client {
constructor() {
this.init();
}
client = undefined;
checkToken = async () => {
// 这里可能需要重新获取(过期),也有可能直接返回(有效)
return "123";
}
init = async () => {
const token = await this.checkToken();
// 这里并不会立即执行完
this.client = new ThirdPartyClient(token);
}
subscribe = () => {
// 此时 this.client 是 undefined
if (!this.client) return;
}
}
const client = new Client();
// 执行失败,因为未初始化
client.subscribe("Some Topic");
我能想到的解决办法有两种,一个是不要在外部执行 subscribe
方法,改为一个参数,对应逻辑在类的内部执行。要么就是把实例化返回的对象改为 Promise,Promise 里面再返回 this
指向实例本身(但不晓得是否可能存在什么问题,外部实例化后的其他地方调用其内部方法可能就不太灵活了)
对于这样的业务需求,不知道各位有何看法,怎么写才会更加优雅呢。