在订阅(或终结管道)中使用 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/