在我的typescript項目中,我有一個配置和一個控制器類:
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);
})
})
}
}
由于配置類必須與I/O和服務器連接一起工作,因此會使用(準備好)承諾來確定該類何時可用,因此,該類始終按如下方式調用:config.then(() => {code})
。這種工作方式經過測試,并在隔離狀態下正常工作。
現在,控制器類以同樣的方式工作,因此,當正確地調用它時:controller.then(() => {code})
,它應該意味著配置對象也準備好了,但事實并非如此,因為控制器atributes的值是dir2和file2。
我的推理或代碼有什么錯誤?
這創建了一個新的承諾,它啟動了一些異步內容,然后立即解析為未定義。在你打電話給
resolve
之前,你沒有等待任何東西。因為您手頭已經有了承諾,所以根本不需要使用
new Promise
構造函數。只有當您將不使用承諾的內容轉換為使用承諾的內容時,才真正需要該構造函數。您可以創建兩個承諾來讀取logDir和logFile,然后使用Promise.all
將它們組合起來: