Я пишу эффект с условным оператором iif
внутри него, и я не могу понять, почему он не работает с concat
, но работает с defer
.
Версия с concat
:
@Effect()
init$(): Observable<Action> {
return defer(() =>
timer(0, 5000).pipe(
withLatestFrom(
this.store$.pipe(select(fromMessages.getMessageDetails)),
this.store$.pipe(select(fromCalendar.getDates)),
this.store$.pipe(select(getCurrentUrl)),
),
filter(([_, __, ___, url]) => url && url.includes('message')),
concatMap(([_, messageDetails, dates]) =>
iif(
() => !!messageDetails,
concat(
of(
new LoadMessageOverview(dates.startDate, dates.endDate),
// --> ERROR new LoadMessageDetails({controlArea: messageDetails.controlArea, date: messageDetails.date})
)
),
of(new LoadMessageOverview(dates.startDate, dates.endDate))
)
)
)
);
}
Когда вызывается init $, !!messageDetails
равен false
, и хотя мы должны перейти прямо к третьему аргументу iif
и пропустите второй (или, может быть, я правильно понял, если я ошибаюсь?), я получаю сообщение об ошибке
ERROR TypeError: Cannot read property 'controlArea' of null
at MergeMapSubscriber.project (message-overview.effects.ts:82)
at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:61)
at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._next (mergeMap.js:51)
at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
at FilterSubscriber.push../node_modules/rxjs/_esm5/internal/operators/filter.js.FilterSubscriber._next (filter.js:38)
at FilterSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
at WithLatestFromSubscriber.push../node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js.WithLatestFromSubscriber._next (withLatestFrom.js:66)
at WithLatestFromSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
at AsyncAction.dispatch [as work] (timer.js:31)
at AsyncAction.push../node_modules/rxjs/_esm5/internal/scheduler/AsyncAction.js.AsyncAction._execute (AsyncAction.js:63)
Однако, когда я использую эту версию с defer
, все работает нормально:
@Effect()
init$(): Observable<Action> {
return defer(() =>
timer(0, 5000).pipe(
withLatestFrom(
this.store$.pipe(select(fromMessages.getMessageDetails)),
this.store$.pipe(select(fromCalendar.getDates)),
this.store$.pipe(select(getCurrentUrl)),
),
filter(([_, __, ___, url]) => url && url.includes('message')),
concatMap(([_, messageDetails, dates]) =>
iif(
() => !!messageDetails,
defer(() => of(
new LoadMessageOverview(dates.startDate, dates.endDate),
new LoadMessageDetails({controlArea: messageDetails.controlArea, date: messageDetails.date})
)),
of(new LoadMessageOverview(dates.startDate, dates.endDate))
)
)
)
);
}
Почему из блока выдается ошибка, которую мы должны пропустить?Почему concat
не работает, а defer
не работает?