Не удается сделать итеративный вызов rxjs ajax

1

Я отправил действие, в котором массив удаленных пользователей был удален. но при этом в цикле я получаю сообщение об ошибке "Вы предоставили" неопределенный ", где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable".

const removeUsersEpic = action$ => {
  return action$.ofType(REMOVE_USERS)
    .mergeMap((action) => {
      for (let i = 0; i < action.payload.length; i++) {
        Rx.Observable.ajax({
          headers: {'X-Requested-With': 'test', 'Content-Type': 'application/form-data'},
          method: 'DELETE',
          url: 'https://localhost/api/v1/users/${action.payload[i]}',
          body: {}
        })
        .map((response) => {
          return setUserDeleteCount(action.payload.length)
        }).toPromise()
        .catch((error) => {
          console.log(error)
          return setUserDeleteExceptionCount(1)
        })
      }
    }
    )
}

Api получает вызов в цикле, но после окончания цикла я получаю эту ошибку.

  • 0
    mergeMap() должен возвращать наблюдаемое. В вашем коде он ничего не возвращает (следовательно, не определен). Операторы возврата в вашем коде предназначены для внутреннего потока ajax ().
Теги:
rxjs
redux

1 ответ

0
Лучший ответ

В соответствии с тем, что уже было предложено @kctang, вы можете попробовать что-то в этом направлении

const removeUsersEpic = action$ => {
  return action$.ofType(REMOVE_USERS)
    .switchMap((action) => {
      Rx.Observable.from(action.payload).mergeMap(
        payload => Rx.Observable.ajax({
          headers: {'X-Requested-With': 'test', 'Content-Type': 'application/form-data'},
          method: 'DELETE',
          url: 'https://localhost/api/v1/users/${payload}',
          body: {}
        })
    })
}

Вся идея состоит в том, что через Rx.Observable.from(action.payload) вы создаете Observable, который испускает столько элементов, сколько элементов в массиве action.payload.

Для каждого испускаемого элемента вы создаете другое Наблюдаемое через Rx.Observable.ajax.

Вы, чем использовать mergeMap чтобы сгладить его и получить Наблюдаемый ответ на вызовы Ajax.

Как только вы получите событие типа action$.ofType(REMOVE_USERS) вы хотите перейти на новый Observable, который мы только что обсуждали, то есть тот, который вы создаете через Rx.Observable.from(action.payload).mergeMap(...).

В конце концов вы управляете результатом ваших операций, когда подписываетесь на Наблюдаемый, который вы создали, посредством всех этих преобразований

removeUsersEpic.subscribe(
  data => console.log('Delete done - response', data),
  err => console.error(err),
  () => setUserDeleteCount(action.payload.length)
)

Это просто, чтобы дать вам представление о способе объединения Observables, который должен помочь вам получить то, что вы хотите. Вы можете прочитать эту статью, чтобы иметь некоторые подробности о том, как совместить Наблюдаемый с использованием from switchMap и mergeMap.

  • 0
    Спасибо @picci. Если я сделаю это с помощью .from, тогда вы сможете помочь мне запустить действие после того, как наблюдаемое прекратит излучать данные. Как и в этом примере, Rx.Observable.from (action.payload) это obsetrvable прекратит излучение после того, как в полезной нагрузке нет элемента, после этого я хочу вызвать какое-то действие. где я должен написать это
  • 0
    Когда Observable завершается, выполняется функция, предоставленная в качестве третьего параметра subscribe (если есть). Это () => setUserDeleteCount(action.payload.length) в приведенном выше примере

Ещё вопросы

Сообщество Overcoder
Наверх
Меню