相关承诺

Related Promises

在我的打字稿项目中,我有一个配置和一个控制器class:

class Config {
    public Ready: Promise<any>;
    private logDir: string = 'dir1'; 
    private logFile: string = 'file1';
    private client = new Etcd3();

    constructor(defaultLogDir?: string, defaultLogFile?: string){
        this.Ready = new Promise((resolve, reject) => {
            this.readLogDir().then(res => { this.logDir = res; });
            this.readLogFile().then(res => { this.logFile = res; });
            resolve(undefined);
        })
    }
}
class Controller {
    public Ready: Promise<any>;
    public config: Config = new Config();
    private logDir: string = 'dir2'; 
    private logFile: string = 'file2';

    constructor(){
        this.Ready = new Promise((resolve, reject) => {
            this.config.Ready.then(() => {
                this.logDir = this.config.getLogDir();
                this.logFile = this.config.getLogFile();
                resolve(undefined);
            })
        })
    }
}

由于配置 class 必须与 I/O 和服务器连接一起使用承诺(就绪)来确定 class 何时可用,因此,class 总是按如下方式调用:config.then(() => {code})。这种工作方式已经过测试并且可以正确隔离。

现在,控制器 class 以相同的方式工作,因此,当它被正确地调用时:controller.then(() => {code}),它应该意味着 Config 对象也已准备就绪,但事实并非如此,因为控制器属性的值为 dir2 和 file2.

我的推理或代码有什么问题?

new Promise((resolve, reject) => {
   this.readLogDir().then(res => { this.logDir = res; });
   this.readLogFile().then(res => { this.logFile = res; });
   resolve(undefined);
})

这会创建一个新的承诺,它会启动一些异步内容,然后立即 解析为未定义。在致电 resolve.

之前,您无需等待任何事情

由于您手边已经有了 promise,因此根本不需要使用 new Promise 构造函数。仅当您将不使用 promises 的内容转换为使用 promises 的内容时,才真正需要该构造函数。您可以创建两个读取 logDir 和 logFile 的承诺,然后使用 Promise.all 组合它们:

this.ready = Promise.all([
  this.readLogDir().then(res => { this.logDir = res; }),
  this.readLogFile().then(res => { this.logFile = res; })
]);

我注意到 OP post 中的标题是关于有前途的链接。请注意 node.js 是异步的,在给定的实现中,这两个承诺是同时执行的。参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#chaining

 this.readLogDir().then(res => {
   this.logDir = res; 
   this.readLogFile().then(res => { this.logFile = res; });
 });

链接示例 ^