我有一个像这样的史诗:
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
操作并为用户提出一个请求。
现在我想一遍又一遍(延迟)取出字符,直到取消一些操作。我怎样才能做到这一点?
答案 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()