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

使用take(1)时请求状态为canceled,不使用则重复触发的问题排查

解决方案

问题根源分析

  1. 嵌套订阅导致重复触发:getValidateCart()内部直接订阅activeCartFacade.getActive(),每次调用该方法都会新增订阅,再加上validateCartQuery$配置了reloadOn导航事件,进一步引发重复请求。
  2. take(1)终止未完成请求:validateCartQuery$.getState()返回的是持续状态流,take(1)会在获取第一个值后立即取消订阅,此时axios的POST请求可能还未完成,直接被终止。

步骤1:修复getValidateCart()方法

重构方法,避免内部嵌套订阅,确保参数正确传递,减少重复触发:

getValidateCart(): Observable<any> {
  return this.activeCartFacade.getActive().pipe(
    // 仅当购物车数据变化时才触发后续逻辑
    distinctUntilChanged((prev, curr) => prev.code === curr.code && prev.user?.uid === curr.user?.uid),
    switchMap((cartItem: any) => {
      const code = cartItem.user?.uid === "anonymous" ? cartItem.guid : cartItem.code;
      const userId = cartItem.user?.uid;
      return this.validateCartState(userId, code).pipe(
        map((state: any) => state ?? []),
        // 过滤空状态,确保获取有效响应
        filter(state => !!state)
      );
    })
  );
}

步骤2:实现正确的handleRedirect()方法

用RxJS操作符串联请求,确保顺序执行且仅在两个请求都返回201时跳转,同时避免重复触发:

// 定义销毁流,组件销毁时自动清理订阅
private destroy$ = new Subject<void>();

handleRedirect() {
  this.ValidateCartService.getValidateCart().pipe(
    // 仅处理一次有效请求
    take(1),
    // 校验getValidateCart响应状态码为201
    filter((response: any) => response.status === 201),
    // 串联执行setCart请求
    concatMap(() => this.ValidateCartService.setCart()),
    // 校验setCart响应状态码为201
    filter((response: any) => response.status === 201),
    // 组件销毁时终止订阅
    takeUntil(this.destroy$)
  ).subscribe({
    next: () => {
      this.routingService.go({ cxRoute: 'checkout' });
    },
    error: (err) => {
      console.error('请求失败:', err);
    }
  });
}

// 组件生命周期钩子:清理订阅
ngOnDestroy() {
  this.destroy$.next();
  this.destroy$.complete();
}

额外优化建议

  • 调整setCart()的返回值结构,确保包含响应状态码(比如返回{ data: 响应体, status: 状态码 }),方便后续校验。
  • 若业务不需要validateCartQuery$的reloadOn配置,可直接移除,避免导航时自动重复发起请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:43:15