为什么我不能使用concat而不是延迟ngrx-effect?

时间:2019-03-27 11:14:06

标签: angular ngrx ngrx-effects

我在其中写有条件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 $时,!!messageDetailsfalse,即使我们应该直接跳到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不能起作用?

0 个答案:

没有答案