Если это просто вызов API, вам не нужно отписываться, потому что он завершается сам по себе. Вы можете использовать switchMap
для цепочки и filter
для .. фильтра :). И у вас есть хорошая цепочка операторов rx js, которая самостоятельно завершает
this.store.pipe(
select(isLoggedIn),
take(1),
filter((isLoggedIn) => isLoggedIn),
switchMapTo(this.store),
select(hasCarriersLoaded),
take(1),
filter((hasCarriersLoaded) => !hasCarriersLoaded),
).subscribe(() => this.store.dispatch(new CarriersPageRequested()));
Такое ощущение, что вы можете комбинировать два выбора:
combineLatest([
this.store.pipe(select(isLoggedIn)),
this.store.pipe(select(hasCarriersLoaded))
]).pipe(
take(1),
filter(([loggedIn, hasCarriers]) => loggedIn && !hasCarriers)
).subscribe(() => this.store.dispatch(new CarriersPageRequested()));
Если вам необходимо чтобы дождаться входа пользователя в систему, во время обработки этого запроса вы можете сделать следующее:
combineLatest([
this.store.pipe(select(hasCarriersLoaded)),
this.store.pipe(
select(isLoggedIn),
filter((loggedIn) => loggedIn)
)
]).pipe(
take(1),
filter(([hasCarriers]) => !hasCarriers)
).subscribe(() => this.store.dispatch(new CarriersPageRequested()));
Если вам также нужно подождать, чтобы войти в систему, чтобы вызвать hasCarriersLoaded
, вам следует переключить filter
с take(1)
в первом примере