Почему я не могу использовать concat вместо defer в ngrx-эффекте? - PullRequest
0 голосов
/ 27 марта 2019

Я пишу эффект с условным оператором 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 не работает?

...