Как передать два разных состояния из моего эффекта ngrx в мою сервисную функцию? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть функция эффектов, в которой я пытаюсь передать данные из отправленного действия, а также отдельный селектор в функцию в службе, но я теряюсь в синтаксисе RX JS. Я почти уверен, что неправильно отображаю данные. См. Соответствующий код.

// эффекты

 updateCohort$ = createEffect(() =>
    this.actions$.pipe(
        ofType(getCohortActions.updateActiveCohort.type),
        withLatestFrom(this.store.pipe(select(activeCohort))),
        map(([action, selector ]) => (
            this.cohortFeaturesServices.updateCohorts(action, selector)
        )),

// service

public updateCohorts(action, selector): Observable<any> {
    const url = `api/services/cohorts/frontend/`;

    return this.http.patch(`${url}/${selector.id}/`, action.changes);
}

Код Visual Studio подчеркивает всю функцию, и я получаю следующую ошибку в моя консоль.

Тип "Observable>" нельзя назначить типу "Observable". Свойство 'type' отсутствует в типе 'Observable', но требуется в типе 'Action'.

Как я могу исправить свой эффект и успешно передать свое действие и селектор моему вызову службы?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вам необходимо использовать switchMap/mergeMap/concatMap/exhaustMap, чтобы "распаковать" наблюдаемое, поступающее из службы HTTP -> результат switchMap -> map в действие , например, ваш эффект должен возвращать действия (такие как это просто эффект по умолчанию с диспетчеризацией действия.)

Кроме того, я предлагаю, чтобы метод API имел изменения в качестве параметров, а не действие.

updateCohort$ = createEffect(() =>
  this.actions$.pipe(
    ofType(getCohortActions.updateActiveCohort.type),
    withLatestFrom(this.store.pipe(select(activeCohort))),
    switchMap(([action, cohort]) =>
      this.cohortFeaturesServices.updateCohorts(action.changes, cohort)
    ),
    map((result: CohortUpdateResponse) => successCohortUpdateAction())
  )
)


public updateCohorts(changes: Partial<Cohort>, cohort: Cohort): Observable<CohortUpdateResponse> {
  const url = `api/services/cohorts/frontend/`;

  return this.http.patch(`${url}/${cohort.id}/`, changes);
}

Что-то вроде этого.

PS добавил несколько «изобретенных» типов, чтобы показать, что происходит и где

PSS не проверял опечатки в коде, такой письменный ответ прямо в окне ответа

GL: )

0 голосов
/ 17 февраля 2020

Для кого-то еще они могут столкнуться с той же проблемой, что я понял. Я не возвращал действие.

updateCohort$ = createEffect(() =>
    this.actions$.pipe(
        ofType(getCohortActions.updateActiveCohort.type),
        withLatestFrom(this.store.pipe(select(activeCohort))),
        exhaustMap(([action, cohort]) => this.cohortFeaturesServices.updateCohorts(action, cohort).pipe(

        )),
        map((response) => ({
            type: getCohortActions.updateActiveCohortSuccess.type, // success action
            success: response
        })),
        catchError((err) => of(getCohortActions.updateActiveCohortError(err))) // error action
    )
)
...