相关承诺
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; });
});
链接示例 ^
在我的打字稿项目中,我有一个配置和一个控制器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; });
});
链接示例 ^