如何在JavaScript的async/await Promise中传递完整对象?
问题解答
1. 初始传参问题修正
你提供的TaskRepository中update方法明确要求接收ITask类型的完整对象作为入参,你最初写的<Task[]>(task.id)既存在类型不匹配问题,也只传入了id字段不符合方法入参要求,直接传入方法已有的task参数即可,同时可以同步修正execute方法的其他逻辑漏洞:
async execute(task: ITask): Promise<boolean> { return new Promise((resolve) => { this.confirmation .confirmDelete(`${task.id} - ${task.title}`) .subscribe(async (confirmed) => { if (confirmed) { // 直接传入完整的task对象,完全匹配update方法的入参要求 await this.repository.update(task); // 原代码中afterClosed()返回的是Observable,需要转成Promise才能正常await await this.dialogService .openConfirmDialog('Are you really want to delete/update/create?') .afterClosed() .toPromise(); } resolve(confirmed); }); }); }
你也可以直接使用RxJS提供的firstValueFrom工具方法简化Observable转Promise的逻辑,不用手动编写new Promise的包装代码。
2. 组件报错问题修复
你标注的response赋值行报错,常见原因和对应修复方案如下:
- 若报错为返回值类型不匹配:检查
UpdateTaskHandler.execute的返回值类型,如果返回的是Observable而非Promise,需要调用toPromise()或者用firstValueFrom包裹后再await;如果返回的是ITask类型而非ITask | undefined,直接调整response的类型定义为ITask即可。 - 若报错为入参类型不匹配:检查你的
ITask接口定义,确保id字段为string | undefined类型,同时表单返回的form.value包含ITask要求的所有字段。如果id字段要求必填,可以在调用更新方法时添加类型断言:await this.updateTaskHandler.execute(taskToSave as ITask)。 - 若报错为未捕获的异步异常:给所有
await调用包裹try catch逻辑,捕获接口调用、弹窗交互可能抛出的异常,避免运行时报错。
内容的提问来源于stack exchange,提问作者leandroter7
相关产品推荐
相关产品推荐

