【发布时间】:2020-09-10 04:30:06
【问题描述】:
我有一个与 redux-saga 相关的问题,有什么方法可以实现 takeLatest 但有条件。
例如,我有一个动态的歌曲类型列表(Rap、Pop、Hip_hop...),我想按歌曲类型获取歌曲。我定义了一个类型为“FETCH_SONGS_BY_TYPE”的 redux-action,然后将 songType 传递给它。动作看起来像
// actions
const fetchSongsByType = songType => ({
type: FETCH_SONGS_BY_TYPE,
songType
});
--------------------------------------------------
//saga
function* fetchSongsByTypeSaga(action) {
// request songs list by action.songType
}
function* Saga() {
yield takeLatest(FETCH_SONGS_BY_TYPE, fetchSongsByTypeSaga);
}
所以我希望只有在下一个 saga 运行具有相同的 songType 时才取消上一个 saga 任务。
在上面的代码中,我得到了这个:
- fetchSongs - songType: Hip_hop(因 [2] 而取消)
- fetchSongs - songType:说唱(因 [3] 而取消)
- fetchSongs - songType: Pop(因 [4] 而取消)
- fetchSongs - songType:说唱(因 [5] 而取消)
- fetchSongs - 歌曲类型:流行音乐
但我预计会是这样的:
- fetchSongs - 歌曲类型:嘻哈
- fetchSongs - songType:说唱(因 [4] 而取消)
- fetchSongs - songType: Pop(因 [5] 而取消)
- fetchSongs - 歌曲类型:说唱
- fetchSongs - 歌曲类型:流行音乐
感谢任何帮助,在此先感谢。
【问题讨论】:
-
您如何期望
redux知道4会发生?如果2和4之间的持续时间很长,那么redux怎么知道要等待多长时间?最好在React层处理这样的逻辑 -
嗨@codemax,感谢您的回复,我不提及持续时间,因为takeLatest的逻辑是如果调用4时2仍在运行,则2将被取消。但我希望它只应在下一次 saga 运行具有与正在运行的任务相同的 songType 时取消。
标签: javascript reactjs react-redux redux-saga