稍后在控制器中将异步服务函数标记为异步
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:
我了解到带有异步调用的函数(例如查询数据库)标记为 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: