如何让deleteBudgets方法返回Promise以支持updateBudgets中使用await?
解决方案
我来帮你搞定这个问题!你的deleteBudgets方法虽然声明了返回Promise<void>,但实际上并没有正确返回一个有效的Promise——它只是循环触发了多个删除操作,却没有等待这些操作完成,也没有把这些异步操作的Promise串联起来。另外,updateBudgets要使用await的话,本身必须标记为async方法,返回类型也要改成Promise<Budget[]>。
1. 修正deleteBudgets方法
我们需要把每个删除操作返回的Promise收集起来,用Promise.all等待所有操作完成,这样整个方法就能返回一个符合声明的Promise:
deleteBudgets(data: Budget[], projectId: string): Promise<void> { // 用map遍历数据,收集每个删除操作的Promise const deletePromises = data.map((d: Budget) => { return this.fireStore.doc(`projects/${projectId}/budgets/${d.id}`).delete(); }); // Promise.all会等待所有删除操作完成,最后返回一个void的Promise return Promise.all(deletePromises).then(() => {}); }
为什么这么改?
forEach只是执行操作但不会返回结果,而map可以帮我们生成一个包含所有删除Promise的数组。Promise.all会等待数组里所有的Promise都成功resolve后才会自己resolve,这样就能保证所有删除操作都完成后,deleteBudgets的Promise才会完成,符合你在updateBudgets里用await等待删除完成的需求。
2. 修正updateBudgets方法
要使用await,这个方法必须标记为async,同时返回类型要改成Promise<Budget[]>。另外还要注意给deleteBudgets传递缺失的参数,并且如果需要保证所有更新操作完成后再返回结果,也可以用Promise.all等待更新:
async updateBudgets(data: Budget[], projectId: string): Promise<Budget[]> { // 传递data和projectId参数给deleteBudgets,等待删除完成 await this.deleteBudgets(data, projectId); const budgets: Budget[] = []; // 收集所有更新操作的Promise(可选但推荐,保证数据写入完成) const updatePromises = data.map((d) => { const budgetId = this.fireStore.createId(); d.id = budgetId; budgets.push(d); return this.fireStore.doc<Budget>(`projects/${projectId}/budgets/${budgetId}`).set({ id: budgetId, amount: d.amount, contingency: d.contingency, budgetGroup: d.budgetGroup, creationTime: moment().format() }); }); // 等待所有更新操作完成后再返回budgets await Promise.all(updatePromises); return budgets; }
关键修改点:
- 给方法加上
async关键字,这是使用await的前提,同时方法返回类型变为Promise<Budget[]>(async函数默认返回Promise)。 - 调用
deleteBudgets时补上了data和projectId参数,避免参数缺失报错。 - 收集更新操作的Promise并
await,确保所有数据都写入数据库后再返回结果,避免出现返回了budgets但数据库还没完成更新的不一致情况。
内容的提问来源于stack exchange,提问作者Sampath
相关产品推荐
相关产品推荐

