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

Angular中如何控制扣减、恢复库存两个方法的执行顺序?

问题根源

执行顺序混乱是因为HttpClient返回的是异步Observable,调用subscribe后不会阻塞后续代码执行,主线程会直接继续运行后续的恢复库存逻辑,等http请求响应回来才会触发subscribe里的回调,因此会先打印恢复库存相关日志,最后才打印method1和method2的执行日志。

解决方案

使用RxJS的forkJoin操作符批量执行并行请求,等所有扣减库存请求全部完成后,再触发恢复库存的逻辑即可。

首先从rxjs导入依赖:

import { forkJoin } from 'rxjs';

调整后的业务逻辑代码如下:

// 1. 收集所有扣减库存的请求
const deductStockRequests = productsItem.map(item => {
  const id = item.product.id;
  const quantity = item.quantity;
  console.log("ID: " + id);
  console.log("Quantity: " + quantity);
  // 直接返回Observable,不在此处subscribe
  return this.productService.productStock(Number(id), quantity);
});

// 2. 批量执行所有扣减库存请求
forkJoin(deductStockRequests).subscribe({
  next: () => {
    // 所有扣减请求都完成后才会进入当前回调
    console.log("Executing method '1'(扣减库存)");
    console.log("Cycle finished");

    // 3. 开始执行恢复库存逻辑
    console.log("Recovering the stock of the products");
    const recoverStockRequests = productsItem.map(item => {
      const id = item.product.id;
      const quantity = item.quantity;
      console.log("ID: " + id);
      console.log("Quantity: " + quantity);
      return this.productService.retrieveProductStock(Number(id), quantity);
    });

    // 4. 批量执行所有恢复库存请求
    forkJoin(recoverStockRequests).subscribe({
      next: () => {
        console.log("Executing method '2'(恢复库存)");
        console.log("Cycle finished");
      },
      error: (err) => console.error('恢复库存失败:', err)
    })
  },
  error: (err) => console.error('扣减库存失败:', err)
})

额外优化建议

你服务方法里写的try/catch无法捕获http异步请求的异常,异步异常需要在subscribe的error回调中处理,可以直接把服务方法里的try/catch删掉。

内容的提问来源于stack exchange,提问作者Justanuser2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 22:36:02