Я относительно новичок в RXJS, поэтому прошу прощения, если это повторяется. Я попытался найти ответы, но не смог их найти, возможно потому, что не знаю, какие условия поиска использовать.
Я пытаюсь понять, как я могу узнать, когда завершается блок finalize вызова службы, потому что он обновляет переменную общего состояния.
Вот его stackblitz, хотя я также опубликую ниже фрагменты: 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
Значение isLoading в serviceCall finalize: false
Почему finalize
из serviceCall
вызывается ПОСЛЕ полного обработчика блока подписки ngOnInit
? И как мне узнать, когда serviceCall
завершил свои манипуляции с общей переменной, если не через завершенный обработчик?