具有redux-observable的Rxjs。重复动作

时间:2017-11-12 17:52:13

标签: redux rxjs rxjs5 redux-observable

我有一个像这样的史诗:

export const fetchCharacter = (id) =>
  ajax({ url: `https://swapi.co/api/people/${id}` })
    .map(response => fetchCharacterSuccess(response.body))
    .catch(error => Observable.of(fetchCharacterFailure(error.response.body)));

export const startFetchingCharacters = () => ({ type: START_FETCHING_CHARACTERS });

export const fetchUserEpic = (action$, store) =>
  action$.ofType(START_FETCHING_CHARACTERS)
    .delay(3000)
    .mergeMap(
      action => api.fetchCharacter(store.getState().nextCharacterId)
    );

现在它只会监听START_FETCHING_CHARACTERS操作并为用户提出一个请求。

现在我想一遍又一遍(延迟)取出字符,直到取消一些操作。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:5)

if-statements observable映射到api fetch(或.interval(),具体取决于您想要的延迟模式)。

使用.timer()停止。

takeUntil()

脚注

严格地说,内部const delay = 3000 const fetchUserEpic = (action$, store) => action$.ofType(START_FETCHING_CHARACTERS) .mergeMap( action => Observable.interval(delay) .mergeMap(x => api.fetchCharacter(store.getState().nextCharacterId) ) .takeUntil(action$.ofType(STOP_FETCHING_CHARACTERS)) ); 不保证字符返回的顺序。由于mergeMap()是异步的,因此fetch可能无序返回(尽管长时间延迟3秒有助于避免这种情况)。

在内部observable上使用api.fetchCharacter()可确保以严格的concatMap()顺序执行发送。

nextCharacterId()