Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有条件地重演传奇_Javascript_Reactjs_React Redux_Redux Saga - Fatal编程技术网

Javascript 有条件地重演传奇

Javascript 有条件地重演传奇,javascript,reactjs,react-redux,redux-saga,Javascript,Reactjs,React Redux,Redux Saga,我有一个关于redux传奇的问题,那就是是否有任何方法可以实现这个目标,但要有条件 例如,我有一个歌曲类型的动态列表(说唱、流行、嘻哈…),我想按歌曲类型获取歌曲。我使用类型“FETCH_SONGS_BY_type”定义一个redux操作,然后将songType传递给它。这个动作看起来像 // actions const fetchSongsByType = songType => ({ type: FETCH_SONGS_BY_TYPE, songType }); -------

我有一个关于redux传奇的问题,那就是是否有任何方法可以实现这个目标,但要有条件

例如,我有一个歌曲类型的动态列表(说唱、流行、嘻哈…),我想按歌曲类型获取歌曲。我使用类型“FETCH_SONGS_BY_type”定义一个redux操作,然后将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);
}
因此,我希望,只有在下一个传奇运行具有相同的歌曲类型时,才能取消上一个传奇任务

在上面的代码中,我得到:

  • fetchSongs-歌曲类型:嘻哈(因[2]而取消)
  • fetchSongs-歌曲类型:Rap(由于[3]而取消)
  • fetchSongs-歌曲类型:Pop(由于[4]而取消)
  • fetchSongs-歌曲类型:Rap(由于[5]而取消)
  • fetchSongs-歌曲类型:Pop

  • 但我预计会是这样的:

  • fetchSongs-歌曲类型:嘻哈
  • fetchSongs-歌曲类型:Rap(由于[4]而取消)
  • fetchSongs-歌曲类型:Pop(由于[5]而取消)
  • fetchSongs-歌曲类型:Rap
  • fetchSongs-歌曲类型:Pop

  • 我感谢您的帮助,提前感谢。

    如果您查看的文档,您将看到如何使用低级效果构建此效果。通过本例,您可以轻松创建自定义效果,该效果仅取消来自同一音乐类型的动作

    takeLatestByType:

    const takeLatestByType=(pattern或channel,saga,…args)=>fork(函数*(){
    //保留对type属性标识的每个分叉传奇的引用
    让lastTasks={};
    while(true){
    const action=屈服带(pattern或channel);
    //如果有相同类型的分叉传奇,请取消它。
    if(lastTasks[action.type]){
    产生取消(lastTasks[action.type]);
    }
    lastTasks[action.type]=收益分叉(saga,…args.concat(action));
    }
    });
    
    用法:

    函数*Saga(){
    按类型获取最新收益(按类型获取歌曲,按类型获取歌曲);
    }
    
    您如何期望
    redux
    知道将发生
    4
    ?如果
    2
    4
    之间的持续时间很长,
    redux
    如何知道等待多长时间?最好在
    React
    layerHi@codemax中处理这样的逻辑,谢谢你的回复,我没有提到持续时间,因为takeLatest的逻辑是,如果2在调用4时仍然运行,那么2将被取消。但我希望只有在下一个传奇系列具有相同歌曲类型的跑步任务时,它才会取消。嗨,克里斯蒂安,谢谢你的回复。我会将此标记为已接受