Почему действие не вызывает эффекта во второй раз? - PullRequest
0 голосов
/ 07 октября 2018

Эффект:

@Effect()
  loadDocsEffect$ = this.actions$.pipe(
    ofType(myActionTypes.LoadDocs),
    mergeMap(action => this.myService.getDocs()),
    map(data => new LoadDocsSuccess(data)),
    catchError(error => Observable.of(new LoadDocsFailure(error)))
  );

Работает, когда мне возвращаются данные, но когда сервер отвечает с ошибкой - например, 404, наблюдаемое завершено и не запускаетсяэффект второй раз, когда я отправляю действие.Я искал способ правильно обработать ошибку и продолжить наблюдаемый поток, чтобы я мог подписаться на него в своем компоненте и действовать соответствующим образом.

Решение в @ ngrx Effect не запускается второй раз не работает для меня, или я не могу заставить его работать.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Я гарантирую вам, что это правильный способ сделать это.Откуда мне знать?Об этом конкретном вопросе на курсе ngrx Udemy идет длинный разговор, и это решение, которое они предлагают.Обратите внимание, что крайне важно использовать catchError, иначе ответ об ошибке HTTP (любой ответ, отличный от 2xx) отключит этот эффект.

@Effect()
  loadDocsEffect$ = this.actions$.pipe(
    ofType(myActionTypes.LoadDocs),
    mergeMap((action) => {
      // essential to catchError else an HTTP error response will disable this effect
      return this.myService.getDocs().pipe(
        map(data => new LoadDocsSuccess(data)),
        catchError((err) => {
          return of(null)
        })
      )
    }),
    tap(res => console.log(res)) // you won't want this line but useful for debugging
  );

В этом примере, если запрос HTTP завершается успешно, результат new LoadDocsSuccess(data)будет зарегистрирован внутри крана.В случае сбоя HTTP-запроса, null будет зарегистрирован внутри крана.Конечно, вы можете захотеть предоставить другую логику catchError, но вы поняли идею.

0 голосов
/ 07 октября 2018

Вам нужно catchError по запросу вместо actions$.Для этого вам нужно будет изменить свой код следующим образом:

mergeMap(action => 
  this.myService.getDocs().pipe(
    map(data => new LoadDocsSuccess(data)),
    catchError(error => Observable.of(new LoadDocsFailure(error)))
  )
)
...