Задавая этот вопрос для понимания: у меня есть этот код:
export class TpaEditGuard implements CanDeactivate<ResultContainerComponent> {
public editMode: boolean;
public bsModalRef: BsModalRef;
constructor(
private injector: Injector,
private modalService: BsModalService
) { }
public canDeactivate(
target: ResultContainerComponent,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState: RouterStateSnapshot): Observable<boolean> | boolean {
target.hasChanges().subscribe((value) => {
this.editMode = value;
});
if (this.editMode) {
let subject = new Subject<any>();
this.bsModalRef = this.modalService.show(NavigateConfirmComponent,
{ animated: true, keyboard: false, backdrop: false, ignoreBackdropClick: true }
);
this.bsModalRef.content.navEvent = subject;
return this.bsModalRef.content.shouldNavigate();
} else {
return true;
}
}
Теперь if (this.editMode ... находится после и вне подписки. Согласно синхронному потоку, ifдолжен быть оценен до того, как значение this.editmode будет установлено асинхронно и оценено как ложное. Но код работает! Оба способа. If оценивает значение true, если я отправляю наблюдаемое из true из hasChanges асинхронно и появляется диалоговое окно!не устанавливайте this.editMode равным true где-либо ранее. Как это работает? В любой другой ситуации, если бы у нас была подписка и синхронный код, использующий значение из подписки извне, мы бы его не получили. Например:
this.someService.getData().subscribe(data => this.source = data)
console.log(this.source)
Здесь напечатанное значение this.source не было бы значением данных из вызова db / back-end / resource. Было бы напечатано undefined или что-то еще, что было установлено ранее. Как эта асинхронность работает синхронно вcanDeactivate затем?
Кажется, в этом вопросе приводятся аргументыestion здесь когда спрашивающий говорит "Поскольку значение this.savingState в стороже всегда подписано, я не думаю, что проблема с условным условием приведена ниже." .Но я не понимаю этого.Что всегда подписано?Что же тогда не всегда подписывается ?Или что мы делаем специально, чтобы всегда подписывался?Опять же, мой вопрос, как это отличается от примера getData?