如何在TypeScript中同步运行Promise?

时间:2018-01-17 20:04:20

标签: typescript promise

我有几种服务方法需要通过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
    }
}

如何在构造函数中同步运行代码并根据this.db的请求初始化method1实例并进行访问?

2 个答案:

答案 0 :(得分:1)

这看起来不像是承诺?你回来了延期吗?你为什么要自己解决它?

我的建议是让函数返回一个真正的promise并等待,并将调用函数标记为async。当然,在构造函数中没有问题,所以你必须把它移到init函数中。

解决它的一个好处是使用Db制作一个@RequiresDb装饰,并使其成为异步。然后你只需在那里初始化db并缓存结果

答案 1 :(得分:-1)

您可以使用工厂方法异步初始化您想要的内容

export class SampleService {
    private constructor(private db: DB) {}

    static init(envVariables: IEnvSettings) {
        return new DBReady(IEnvSettings).resolve().then(db => {
            return new SampleService(db);
        });
    }

    public method1(id: string) {
        this.db;
    }
}

SampleService.init({}).then(service => {
    service.method1();
});

// or
var service = await SampleService.init({});
service.method1();