1) Если вы хотите, чтобы вызов API был отменяемым, он должен быть частью наблюдаемой цепочки. Когда вызов выполняется внутри subscribe
, его нельзя отменить, поэтому для этого вам придется использовать оператор, например mergeMap
или concatMap
.
this.router.routerUrl$.pipe(
takeUntil(this.ngUnsubscribe),
concatMap(s => {
const param1 = s.state.featureId;
return this.svc.InitFromApi(param1);
})
).subscribe();
Однако, это предполагает, что this.svc.InitFromApi()
возвращает Observable или Promise. Если вы подписываетесь внутри InitFromApi()
или используете then()
в Обещании, тогда это становится невозможным.
2) Вот как устроен takeUntil
. Он реагирует только на уведомления next
. Если вы не хотите звонить как next()
, так и complete()
, вы можете использовать оператор defaultIfEmpty()
:
this.router.routerUrl$.pipe(
takeUntil(this.ngUnsubscribe.pipe(
defaultIfEmpty(null),
))
).subscribe(...);
Тогда вы можете позвонить только this.ngUnsubscribe.complete()
, это также вызовет takeUntil
.
На самом деле, в вашем примере вам даже не нужно звонить complete()
, если вы звоните next()
, потому что при следующем уведомлении цепочка будет выброшена.