angular - ngrx 组件存储效果在 promise 错误后不会触发

标签 angular rxjs ngrx ngrx-effects ngrx-component-store

我的实现

大家好, 我正在为我的 supabase 项目使用 ngrx 组件存储, supabase中有一个delete方法可以删除特定的行, 如果删除(这是一个 promise )一个出错的产品, 我正在 tapResponse 中处理该异常。

readonly deleteProduct$ = this.effect(
    (
      productID$: Observable<string>
    ): Observable<PostgrestResponse<Product>> => {
      return productID$.pipe(
        switchMap((productID) =>
          this._supabaseService.delete<Product>(
            productsPath,
            'id',
            productID,
          )
        ),
        tapResponse(
          ({ data: products, error }) => {
            this.patchState({
              loading: false,
              error,
            });
            this.deleteProduct(products[0]?.id);
            this.toastSuccessMessage(error, 'Deleted Successfully!');
            this.handleError(error);
          },
          (error: Error) => {
            this.handleError(error);
          }
        ),
       catchError(() => EMPTY)
      );
    }
  );

问题

如果我的deleteProduct$效果出错, 我的订阅被关闭了,我不知道为什么, 之后,如果我再次执行deleteProduct$效果,它不会触发

我的猜测

我认为该错误不是通过 catchError 产生的,因此我的订阅已关闭,但我不知道如何解决此问题。

我希望我已经说清楚了, 如果没有,我会尽力说清楚。

我非常感谢您提供的任何帮助。

最佳答案

您应该捕获 HTTP 请求中的错误,而不是主流中的错误。 否则主流将被取消。

这是一个示意性示例:

loadProduct$ = this.effect(productId =>
  productId.pipe(
    switchMap(productId =>
      // pipe is applied to the response
      this.httpService.get(productId).pipe(
        tapResponse(
          product => {
            this.patchState({ product });
          },
          error => {
            this.handleError(error);
          }
        )
      )
    )
  )
);
PS。这个问题对于 NGRX 效果来说也很常见。

关于angular - ngrx 组件存储效果在 promise 错误后不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73346496/

相关文章:

angular - 使用 createReducer 函数时为生产构建 angular+ngrx 8 时出错

angular - 检测页面是否第一次加载组件 Angular 6

angular - 如何在 Angular 6 中创建一个完全动态的按钮?

rxjs - 重复请求直到满足条件并返回中间值

json - 使用 Observable 在 Angular 2 中发出轮询请求

javascript - 使用扩展语法替换字典中的项目

angular cli build 不包含 css 组件

javascript - 如何从 Angular 中的 BehaviouralSubject 中提取值

Angular RXJS 无需订阅即可获取数据

Ngrx 6.1.0 - Select 已弃用 - 新语法是什么?