RX.JS Redux Observable Несколько запросов Get одновременно

1

Я пытаюсь настроить наблюдаемый, который в настоящее время получает массив идентификаторов местоположения, а затем делает запрос на получение всех этих данных сразу и ждет ответа для всех. Вот пример:

const fetchPhotosEpic = action$ =>
    action$.ofType(LOCATIONS_RECEIVED)
    .map(action => action.payload)
    .mergeMap((data) =>  {
        let promiseArray = data.map(location => Observable.fromPromise(axios.get(photosUrl(location.id))))
        return Observable.forkJoin(
           promiseArray
        )
    })
    .map(responses => responses.map((response) => response.data.location))

Где данные выглядят так:

[
    {
        id: "aoeuaeu",
        name: "Test"
    },
  ...
]

Проблема, которую я сейчас имею, - я получаю 404 по одному из запросов, и это все испортит. Я, вероятно, что-то делаю неправильно, поскольку я просто изучаю RX. Любая помощь будет замечательной!

  • 1
    Привет всем. Является ли проблема, которую вы хотите разрешить, случаями, когда один или несколько запросов каким-то образом не выполняются? Что бы вы хотели случиться? Вам действительно нужно дождаться завершения всех запросов? Также не похоже, что вы эпично испускаете действие, вместо этого испускаете сами данные - это упущение в вопросе или проблеме?
  • 0
    @jayphelps, да, я не опубликовал всю эпопею. Если один из них потерпит неудачу, я могу просто проигнорировать это. В идеале я хочу подождать, пока все вернутся, потому что я получу список фотографий с каждой из них, а затем хочу отсортировать их.
Теги:
rxjs
rxjs5
redux-observable

1 ответ

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

Вы можете попробовать добавить улов к каждому вызову и вернуть новое наблюдаемое сообщение об ошибке, которое должно остановить отказ forkJoin, если один запрос завершился с ошибкой. Затем вы можете либо отфильтровать сбои, либо добавить логику для обработки их в своем окончательном.map. например.

const fetchPhotosEpic = action$ =>
    action$.ofType(LOCATIONS_RECEIVED)
    .map(action => action.payload)
    .mergeMap((data) => {
        let promiseArray = data.map(location => {
            return Observable.fromPromise(axios.get(photosUrl(location.id)))
                .catch(error => Observable.of({error}))
      })
      return Observable.forkJoin(
          promiseArray
      )
  })
 .filter(response => !Boolean(response.error))
 .map(responses => responses.map((response) => response.data.location))
  • 0
    Великолепный! Спасибо :)

Ещё вопросы

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