Есть ли лучшее решение этого эпического потока RxJS? - PullRequest
3 голосов
/ 25 сентября 2019

У меня есть состояние редукса, использующее эпосы наблюдаемого редукса

Мне нужно решить, показывать ли сообщение после того, как пользователь удалит объект или несколько объектов.

Существует два способа удаления объекта:

  1. с помощью действия deleteObject(id: string), которое вызывает deleteObjectFulfilled действие
  2. с помощью действия deleteObjects(ids: Array<string>), которое вызывает N * deleteObject(id: string) действия

Я хочу показать только одно сообщение с количеством удаленных сообщений после каждого успешного "удаления действия".

Мое окончательное решение этогоЭпос:

export const showDeleteInformationEpic = action$ =>
  combineLatest(
    action$.pipe(ofType(DELETE_OBJECT_FULFILLED)),
    action$.pipe(
      ofType(DELETE_OBJECTS),
      switchMap(({ meta: { ids } }) =>
        action$.pipe(
          ofType(DELETE_OBJECT_FULFILLED),
          skip(ids.length - 1),
          map(() => ids.length),
          startWith('BATCH_IN_PROGRESS'),
          take(2),
        ),
      ),
      startWith(1),
    ),
  ).pipe(
    startWith([null, null]),
    pairwise(),
    map(([[, previousCount], [, currentCount]]) => 
      (previousCount === 'BATCH_IN_PROGRESS') 
        ? currentCount 
        : isNumber(currentCount) ? 1 : currentCount),
    filter(isNumber),
    map((count) => throwInfo('objectDeleted', { count })),
  );

Можете ли вы найти лучшее решение этого вопроса?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Вместо запуска нескольких действий, вы можете создать и отправить одно действие DELETE_MULTIPLE и передать все id в полезной нагрузке.

Таким образом, ваш effects будет многоочиститель, поскольку вам нужно только действие от subscribe до DELETE_MANY и, кроме того, он предотвратит множественные store отправки.

1 голос
/ 25 сентября 2019

Существует более простое решение, если я использую только deleteObjects(Array<string>) для обоих случаев ..

...