«Ошибка: действия должны быть простыми объектами» в массиве действий, возвращаемых из эпосов - PullRequest
0 голосов
/ 20 мая 2018
Error: Actions must be plain objects. Use custom middleware for async actions.

На всем наборе действий, возвращаемых из эпосов, мы получаем эту ошибку.

это может быть связано с тем, как эпос настроен в epics создателе:

const epic = (action$, store) => 
   action$.ofType(String(key)).mergeMap(action => func(action, store))

либо здесь отображения неверны, либо, скорее всего, они неверны в эпосах.

Пример одного эпоса, названного func(action, store):

  [String(usersActions.updateUser)]: (action, store) => {
    return authFetch(`${API_ROOT}/user/${get(action, 'payload.id')}`, {
      method: 'put',
      headers: {
       ...
      },
      body: ...,
    })
      .then(resJson => {
        if (resJson['status'] === 200) {
          return [
            appActions.pushNotification('success', USER_UPDATE_SUCCESS),
            appActions.setNextPath(`/users/${get(action, 'payload.id')}`),
          ]
        } else
          return [
            appActions.pushNotification(
              'error',
              USER_UPDATE_FAILED + ': ' + resJson['message']
            ),
          ]
      })
      .catch(() => {
        return [appActions.pushNotification('error', USER_UPDATE_FAILED)]
      })
  },

Он работает правильно, если квадраткруглых скобок нет, пробовал с этим предложением тоже:

  [String(usersActions.updateUser)]: (action, store) => {
    return Rx.Observable.fromPromise(
      fetch(`${API_ROOT}/user/${get(action, 'payload.id')}`, {
        method: 'put',
        headers: {},
      }).then(res => res.json())
    )
      .mergeMap(resJson => {
        if (resJson['status'] === 200) {
          return Rx.Observable.concat(
            Rx.Observable.of(
              appActions.pushNotification('success', USER_UPDATE_SUCCESS)
            ),
            Rx.Observable.of(
              appActions.setNextPath(`/users/${get(action, 'payload.id')}`)
            )
          )
        } else return
        Rx.Observable.concat(
          Rx.Observable.of(
            appActions.pushNotification(
              'error',
              USER_UPDATE_FAILED + ': ' + resJson['message']
            )
          )
        )
      })
      .catch(() => {
        Rx.Observable.concat(
          Rx.Observable.of(
            appActions.pushNotification('error', USER_UPDATE_FAILED)
          )
        )
      })
  },

он устраняет ошибку, но отправленные действия теперь дублируются.

Уже пробовал все варианты там, так что надеюсь, что это не такповторный вопрос.

1 Ответ

0 голосов
/ 20 мая 2018

Вы можете добавить .do(action => console.log(action)) в конец своей эпопеи, чтобы увидеть, какие значения вы излучаете, и почему они не являются действиями.например, если это массив действий, это неправильно.Эпос должен только когда-либо испускать простые старые действия javascript со свойством type.

...