稍后在控制器中将异步服务函数标记为异步

Mark an asynchronous service function as asynchronous later in the controller

我了解到带有异步调用的函数(例如查询数据库)标记为 await,整个函数块标记为 async。但是,我显然可以在没有 await 的情况下定义一些异步函数,稍后用 await 调用它们(在我的控制器中),对于其他函数,我被迫立即在我的服务 [=49] 中使用 await =](VSC 编辑器)。

我有一个带有 CRUD 操作的用户服务 class。我可以在没有 await 的情况下定义 findOne()create()find(),即使它们执行异步操作。在控制器中,我将它们与 async-await 一起使用,即使我忘记了,也不会从 VSC 收到错误。但是,我必须在我的服务 class 和 await 中使用我的 update()remove() 函数,因为 VSC 向我显示错误并说我缺少 await .为什么 update()remove() 函数必须立即用 await 标记,而其他三个不用?函数 save()findOne()find() 与我的其他两个函数具有相同的 Promise return 值并访问相同的存储库。

我的代码(服务class):

@Injectable()
export class UsersService {
  constructor(@InjectRepository(User) private repo: Repository<User>) {}

  create(email: string, password: string) {
    const user = this.repo.create({ email, password });

    return this.repo.save(user);
  }

  findOne(id: number) {
    return this.repo.findOne(id);
  }

  find(email: string) {
    return this.repo.find({ email });
  }

  async update(id: number, attrs: Partial<User>) {
    const user = await this.findOne(id);
    if (!user) {
      throw new NotFoundException('user not found');
    }
    Object.assign(user, attrs);
    return this.repo.save(user);
  }

  async remove(id: number) {
    const user = await this.findOne(id);
    if (!user) {
      throw new NotFoundException('user not found');
    }
    return this.repo.remove(user);
  }
}

区别在哪里,然后我是否应该始终将服务 class 中的所有 CRUD 操作立即标记为异步等待,以便稍后能够在控制器中调用它们而无需异步等待?

PS: 对不起,如果我的文字仍然写得太混乱。为什么我必须在函数remove()中写await this.findOne(),但是我可以在同一个class中使用这个函数findOne()this.repo.findOne(id)而没有await ],虽然repo.findOne()是异步函数?

您需要使用 await,因为您希望 return 由 this.findOne(id)

编辑的承诺解析值

并且 this.repo.find() 将 return 一个 promise,因为它是异步的,因此 UsersService#findOne return 也是一个 Promise。所以:

return await this.repo.findOne(id) 的行为与:
相同 return this.repo.findOne(id)


了解 async/await: