redux-observable - ожидайте асинхронных действий и преобразуйте их в Promise с помощью rootEpic

Пример в репозитории next.js показывает, как мы можем преобразовать корневой эпик в Promise, чтобы можно было await выполнять асинхронное действие, например ajax:

static async getInitialProps ({ store, isServer }) {
  const resultAction = await rootEpic(
    of(actions.fetchCharacter(isServer)),
    store
  ).toPromise() // we need to convert Observable to Promise
  store.dispatch(resultAction)

  return { isServer }
}

Мне интересно, как можно await выполнять более одного действия. Мне удалось это сделать так:

const actions = await Promise.all([
  rootEpic(of(fetchCharacterOne()), store).toPromise(),
  rootEpic(of(fetchCharacterTwo()), store).toPromise(),
  rootEpic(of(fetchCharacterThree()), store).toPromise(),
]);

actions.forEach(store.dispatch);

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


person Tomasz Mularczyk    schedule 23.02.2018    source источник


Ответы (1)


Я случайно нашел ответ в документах universal-rxjs-ajax. Вот код, который я искал:

const initialData$ = of(
  fetchCharacterOne(),
  fetchCharacterTwo(),
  fetchCharacterThree(),
);

const actions = await rootEpic(initialData$, store)
  .pipe(toArray()) // buffers all emitted actions until Epic completes
  .toPromise();

actions.forEach(store.dispatch);
person Tomasz Mularczyk    schedule 25.03.2018