我在其中写有条件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
的第三个参数而忽略第二个参数(或者我理解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
不能起作用?