【问题标题】:RxJs. Why a subject emits only once after mergeMap?RxJs。为什么一个主题在mergeMap之后只发出一次?
【发布时间】:2022-01-25 19:25:26
【问题描述】:

我有几个链接,其中一个代表用户的活动订单。当用户点击它时,我想向 API 发送一个 HTTP DELETE 请求。我的组件 ts 文件中有一个函数,它从我的模板中调用,如下所示:

// Component
interface CancelCommand {
    orderId: string
}
private cancelCommands = new Subject<CancelCommand>();

/* Get called from a template on click, like so 
          <a ... (nzOnConfirm)="cancel(ord.id)">Cancel</a> */
cancel(orderId: string) {
    this.cancelCommands.next({
        orderId: orderId
    })
}

我在ngOnInit 中订阅主题cancelCommands

// Component
ngOnInit(): void {
    this.cancelSub = this.cancelCommands.pipe(
        mergeMap((command) => this.service.cancelOrder(command)))
    ).subscribe()
}

在服务中cancelOrder函数只是调用HttpClient

// The Service
cancelOrder(command: CancelCommand) : Observable<CommandResponse> {
      return this.http.delete<CommandResponse>(`${this.url}/${command.orderId}`)
}

我的问题是,为什么 this.cancelSub 订阅的 observable 在取消第一个订单后停止发出值?

【问题讨论】:

  • 这很可能是由于 http.delete 完成并关闭了订阅。在这种情况下,我会使用 switchMap 它为每个删除请求创建一个新的 observable
  • 我建议在 subscribe() 中使用完整的观察者并记录事件——然后你就知道是否发生了错误或者是否调用了完成。无论如何,您应该有一个处理错误情况的处理程序。
  • 我无法复制您的错误:stackblitz.com/edit/angular-ivy-1se9yc?file=src/app/…。显然,如果 observable 出错或完成,订阅将被关闭。尝试检查是否发生此类情况。
  • 我也无法复制错误。同时我想知道您为什么不采用更简单的方法,例如让cancel 方法直接调用cancelOrder 服务方法而不是nexting cancelCommands 主题?
  • @PilgrimViis:您似乎根据条件明确抛出错误。如果一个 observable 发出一个 error,它会在之后关闭,类似于 complete 发射。事实上,errorcomplete 是排他性的。报错后是否继续订阅?

标签: angular rxjs


【解决方案1】:

@PilgrimViis 你检查过可观察的 this.cancelSub 是否真的完成了吗?

@TmTron 我检查了当源 observable 完成时 mergeMap 是否完成,这不是这里的情况:https://stackblitz.com/edit/rxjs-qthnmy?devtoolsheight=33&file=index.ts

【讨论】:

  • 是的,因为在您的情况下,内部 observable 永远不会完成。我指的是 OPs 代码,内部 observable(http 删除请求)将在其中完成。
【解决方案2】:

谢谢大家的建议!在你的帮助下,我想通了。当我的一个请求返回错误并且 observable 停止时,就会发生错误。我已经这样修好了,看起来还可以。

    this.cancelSub = this.cancelCommands.pipe(
      mergeMap((command) => this.service.cancelOrder(command)),
      catchError((_, caught) => caught) // new line
    ).subscribe()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多