你好,我想知道我是否正在使用async等待并正确承诺,基本上我正在使用很多try catch,在我看来,所有这些try catch都是不必要的
我有这个主要课程:
export class BootstrapApplication {
private server: WebServer;
private knex: KnexInstance;
constructor() {
this.server = new ExpressServer();
this.knex = container.resolve(KnexInstance);
}
public start = async () => {
try {
await this.knex.start(knexConfig);
await this.server.start();
} catch (error) {
throw error;
}
};
}
并以此启动服务器:
(async () => {
const server = new BootstrapApplication();
await server.start();
})();
并且我在bootstrap类中有一个函数来启动,在这里我调用knex.start和我的knex start是异步的,它具有3个使用try catch的异步函数:
@singleton()
export class KnexInstance {
private knex: Knex;
public get Knex() {
return this.knex;
}
private assertDatabaseConnection = () => {
return new Promise(resolve => {
this.knex
.raw('select 1+1 as result')
.then(() => resolve())
.catch(err => {
console.log(
'[Fatal] Failed to establish connection to database! Exiting...',
);
console.log(err);
process.exit(1);
});
});
};
private runMigrations = async () => {
try {
console.log('Migration started...');
await this.knex.migrate.latest({ loadExtensions: ['.ts'] });
console.log('Migration finished...');
} catch (err) {
throw err;
}
};
public start = async (config: Knex.Config) => {
if (this.knex instanceof Knex) return;
try {
this.knex = Knex(config);
await this.runMigrations();
await this.assertDatabaseConnection();
} catch (error) {
throw error;
}
};
}
所以我怀疑我是否以错误的方式使用异步等待
答案 0 :(得分:1)
try {
// ...
} catch (e) {
throw e;
}
^在正常和async
函数中,这始终是不执行任何操作的无操作。
您是对的-在示例代码上,您可以安全地删除所有这些结构。
例如,您在start()
中的BootstrapApplication
方法可以等效地写为:
public start = async () => {
await this.knex.start(knexConfig);
await this.server.start();
};
请注意,您不能安全地删除.catch(() => { ... }
中的assertDatabaseConnection
,因为这不仅会引发错误。
不过,您可以将assertDatabaseConnection
简化很多。您根本不需要new Promise
,因为您已经有了一个承诺,因此可以简化为:
private assertDatabaseConnection = async () => {
try {
await this.knex.raw('select 1+1 as result')
} catch (err) {
console.log(
'[Fatal] Failed to establish connection to database! Exiting...',
);
console.log(err);
process.exit(1);
}
};
通常,在大多数情况下,new Promise
并不是异步代码中所需要的,仅在少数情况下才真正需要,主要是在将回调/事件驱动的代码转换为Promise时。