You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:39:53