Как отменить эпопею, чтобы избежать нескольких случаев - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть следующая эпопея (кстати. почему эпопея ?)

const fetchOrders = action$ => {
  console.log('fetchOrders', action$);
  return action$.pipe(
    ofType(FETCH_ORDERS),
    mergeMap(action => interval(2000).pipe(
      map(_ => ordersReceived(mockOrders()))
    ))
  );
};

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

Когда я называю FETCH_ORDERS экшн, начинается этот эпос, тогда каждые 2 секунды ordersReceived отправляется, и это нормально. Но когда я снова запустил это действие, я заметил, что ordersReceived вызывается чаще, но я создал несколько экземпляров, которые теперь запускают отдельные действия. Теперь, есть ли способ, которым я мог бы отменить предыдущий эпический вызов?

Редактировать В документах об отмене я обнаружил, что мне нужно использовать другое действие, на которое отреагирует эпопея, например

const fetchOrders = (action$, state) => {
  console.log('fetchOrders', state);
  return action$.pipe(
    ofType(FETCH_ORDERS),
    mergeMap(action => interval(2001).pipe(
      map(_ => ordersReceived(cloneOrders())),


      takeUntil(action$.pipe(
        filter(action => action.type === FETCH_ORDERS_CANCELLED)
      ))


    ))
  );
};

тогда куда-нибудь позвони dispatch({type:FETCH_ORDERS_CANCELLED}).

Хорошо, но я думал о чем-то более автономном :), поэтому вызов fetchOrders остановит все ранее вызванные.

1 Ответ

0 голосов
/ 15 сентября 2018

switchMap - это то, что вы ищете.он отменит предыдущую наблюдаемую и выдаст значения новой.

const fetchOrders = action$ => {
  console.log('fetchOrders', action$);
  return action$.pipe(
    ofType(FETCH_ORDERS),
    switchMap(action => interval(2000).pipe(
      map(_ => ordersReceived(mockOrders()))
    ))
  );
};
...