【发布时间】:2021-04-25 03:26:33
【问题描述】:
我对 RXJS 比较陌生,所以如果重复,我深表歉意。我尝试搜索答案,但找不到任何答案,可能是因为我不知道要使用哪些搜索词。
我试图了解如何知道服务调用的 finalize 块何时完成,因为它更新了共享状态变量。
这是它的堆栈闪电战,虽然我也会在下面发布 sn-ps:https://stackblitz.com/edit/angular-ivy-xzvkjl
我有一个 Angular 应用程序,其服务将共享 isLoading 标志设置为 true,启动 HTTP 请求,然后使用 finalize 将 isLoading 标志设置回 false,这样无论成功还是错误,检查isLoading标志的项目知道HTTP请求不再处理。
我已将该场景简化为单独的方法而不是单独的类:
isLoading = false;
public ngOnInit() {
this.serviceCall().subscribe(
next => {
console.log("value of isLoading in next handler: " + this.isLoading);
},
err => {
console.log("value of isLoading in error handler: " + this.isLoading);
},
() => {
console.log("value of isLoading in complete handler: " + this.isLoading);
}
);
}
private serviceCall() {
this.isLoading = true;
return this.httpCall().pipe(
tap(value => console.log(value)),
finalize(() => {
this.isLoading = false;
console.log("Value of isLoading in serviceCall finalize: " + this.isLoading);
})
);
}
private httpCall() {
return new Observable(subscriber => {
console.log("Starting emissions");
subscriber.next(42);
subscriber.next(100);
subscriber.next(200);
console.log("Completing emissions");
subscriber.complete();
});
}
我惊讶地发现这个例子的输出是
初始排放
42
下一个处理程序中 isLoading 的值:true
100
下一个处理程序中 isLoading 的值:true
200
下一个处理程序中 isLoading 的值:true
完成排放
完整处理程序中 isLoading 的值:true
serviceCall finalize中isLoading的值:false
为什么serviceCall 的finalize 在ngOnInit 的订阅块的完整处理程序之后被调用?如果不是通过完成的处理程序,我怎么知道serviceCall 何时完成了对共享变量的操作?
【问题讨论】:
标签: angular rxjs observable order-of-execution