У меня есть компонент, который подписывается на несколько частей состояния в конструкторе.
@ViewChild(PComponent) PGrid: PComponent;
ngOnInit() {
this.store.pipe(
select(fromReports.getProcessState),
takeWhile(() => this.componentActive))
.subscribe(selectedProcess=> {
if (selectedProcess) {
this.Data= selectedProcess.Data;
}
});
this.store.pipe(
select(fromReports.getProcessAnalysis),
takeWhile(() => this.componentActive))
.subscribe(analysisData => {
if (analysisData) {
this.PGrid.LoadData(analysisData);
}
});
}
Первая подписка подписывается на массив объектов, тогда как вторая подписка вызывает метод в другом компоненте (@ViewChild (PComponent) PGrid). Метод LoadData()
в компоненте PGrid
зависит от этого. Данные первой подписки.
Когда я запускаю код, я получаю неопределенный для этого. Данные, хотя selectedProcess.Data
, имеют значение
this.store.pipe(
select(fromReports.getProcessState),
takeWhile(() => this.componentActive))
.subscribe(selectedProcess=> {
if (selectedProcess) {
this.Data= selectedProcess.Data; //undefined
}
});
Это означает, что когда подписывается второй фрагмент состояния и метод LoadData()
вызывает его ошибки, поскольку this.Data
не определено.
Я полагаю, это связано с тем, как работают Observable и поскольку они асинхронные c одна функция может не возвращать значение раньше другой.
Que: 1 Почему this.Data= selectedProcess.Data;
устанавливает this.Data
до неопределенного, хотя selectedProcess.Data
имеет значение
Que 2: я смотрел на flatMap
и switchMap
, но так как я новичок в Rx JS и NgRx, я запутался в том, как использовать их , Любые советы?
PS На аналогичной заметке я подписываюсь на 2 среза отдельно в моем ngOnInit()
, это предпочтительный способ или я должен их объединить?