【发布时间】:2018-06-26 19:23:27
【问题描述】:
我有几个服务方法需要通过 Promise 初始化的第三方类实例(参见下面的代码:this.ready.resolve())。为了简化代码,我想将此初始化块放在构造函数中。
import { DBReady } from './db';
export class SampleService {
private db: baqend;
private ready: DBReady;
constructor(private envVariables: IEnvSettings) {
this.ready = new DBReady(envVariables);
this.ready.resolve().then(db => {
this.db = db;
});
}
public method1(id: string): Promise<boolean> {
// this.db must be initialized here
}
}
如何在构造函数中同步运行代码并根据method1 的请求初始化和访问this.db 实例?
【问题讨论】:
-
不能,这是JS的限制。异步代码不能阻塞主线程。
method1在访问this.db之前必须自己等待this.ready。 -
有没有办法简化这段代码?我只是不想为一个类中的每个方法多次重复
this.ready。 -
你需要在你的类中创建静态工厂并返回承诺
-
你可以通过创建一个像
getDB()这样的内部类方法来使它非常干净,它返回一个baqend的承诺然后使用async/await语法你的方法可以只使用const db = await this.getDB()并引用本地db在函数体中。 -
谢谢你 Aaron,我会继续你的建议 :) 刚刚测试过 - 效果很好。
标签: typescript promise