angular - RxJs Observable 未调用完整方法

标签 angular rxjs observable

在订阅(或终结管道)中使用 Angular 的 http 客户端完成,代码永远不会被执行。

简单的例子:

this.http.get(myUrl).subscribe({
    next: results => handleSuccess(results),
    error: err => handleError(err),
    complete: () => handleAllRequests()

handleAllRequests() 函数永远不会被调用。在订阅其他答案之后添加 Finalize 管道或额外的 `.add() 不起作用。

类似问题: Angular 6 / Rxjs - how to basics: observables success, error, finally Angular HttpClient observable not completing

最佳答案

经过一番挖掘,我发现答案很简单但并不明显(至少对我来说)。

归结为理解可观察的“完成”。只要订阅存在(没有取消订阅或者没有调用observer.complete()),完整的代码和finalize管道就不会被调用。

因此,您必须“完成”订阅。对于 Angular http 客户端,我选择使用 take(1) ,它将在执行一次后完成订阅。我经常在 http 请求中使用这种模式,因为通常目标是首先发出一次请求。

虽然上述情况是正确的,但我发现我真正的问题是队友添加了一个带有未完成的 switchMap 的拦截器,这实际上导致每个 HTTP 请求保持不完整,除非像上面的建议那样强制(使用 take( 1)等)

希望这会有所帮助!

关于angular - RxJs Observable 未调用完整方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75063367/

相关文章:

Angular8 ngx-bootstrap 不使用 --prod 编译

unit-testing - 如何模拟 rxjs 6 webSocket 函数进行单元测试?

angular - 使用许多嵌套的 switchMap 是不好的做法吗?

angular - Angular 的 ExceptionHandler 可观察到的错误处理

Angular 7 按日期对 Observable.subscribe() 排序?

angular - 使用 Angular 组件时出现 ExpressionChangedAfterItHasBeenCheck 错误

html - 单击表格单元格上的 Angular 2 使其可编辑

angular - 如何将 Angular2 组件渲染为字符串?

angular - 具有 Angular http 请求的异步管道的好处

jquery - RxJS:请求完成后再次开始发布