打字稿使用try catch和异步等待

时间:2020-10-07 14:52:01

标签: typescript knex.js

你好,我想知道我是否正在使用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;
    }
  };
}

所以我怀疑我是否以错误的方式使用异步等待

1 个答案:

答案 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时。