Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Reactjs 由于位置变化太早,Redux Saga停止_Reactjs_Redux_React Router_React Router Redux_Redux Saga - Fatal编程技术网

Reactjs 由于位置变化太早,Redux Saga停止

Reactjs 由于位置变化太早,Redux Saga停止,reactjs,redux,react-router,react-router-redux,redux-saga,Reactjs,Redux,React Router,React Router Redux,Redux Saga,因此,当路由加载时,我将动态地注入Sagas path: '/home', name: 'home', getComponent(nextState, cb) { require.ensure([], require => { let HomePageReducer = require('./containers/HomePage/reducer').default; let HomePageSagas = require('

因此,当路由加载时,我将动态地注入Sagas

  path: '/home',
  name: 'home',
  getComponent(nextState, cb) {
    require.ensure([],
      require => {
        let HomePageReducer = require('./containers/HomePage/reducer').default;
        let HomePageSagas = require('./containers/HomePage/sagas').default;
        let HomePage = require('./containers/HomePage').default;

        injectReducer('home', HomePageReducer);
        injectSagas(HomePageSagas);

        cb(null, HomePage);
      })
  },
sagas
是这样的:

export function injectAsyncSagas(store) {
  return (sagas) => sagas.map(store.runSaga);
}
Start mySagaFunction
Stop mySagaFunction
其中,
store.runSaga
是在商店创建期间创建的
sagaMiddleware.run

当路线装载时,传奇成功开始。它在倾听行动

export function* mySagaFunction() {
    console.log("Start mySagaFunction");
    while (true) {
    const watcher = yield race({
      loadRepos: take(SOME_HOME_PAGE_ACTION),
      stop: take(LOCATION_CHANGE), // stop watching if user leaves page
    });

    if (watcher.stop) {
      console.log("Stop mySagaFunction", watcher.stop);
      break;
    }
    //other statements here to handle SOME_HOME_PAGE_ACTION
}
当我加载路由时,“启动mySagaFunction”会得到控制。如果我发送一些\u主页\u操作,它会成功地执行它必须执行的任何操作。 当我离开页面时,react路由器调用LOCATION_CHANGE,Saga控制台“Stop mySagaFunction”表示它成功退出while循环

然后我去另一条路线,然后回到这条路线。 正如预期的那样,此时位置更改由路由器发送。但传奇故事开始了,然后马上就停止了。我的控制台是这样的:

export function injectAsyncSagas(store) {
  return (sagas) => sagas.map(store.runSaga);
}
Start mySagaFunction
Stop mySagaFunction
在Redux开发工具中,我只看到一个位置改变。我该如何理解这一传奇故事为何开始并立即停止?只有当我回到路线上才会发生

我想可能是地点变更晚了。但不是。在我的减速器里,我安慰了动作型。减速器首先被调用,位置改变,传奇开始,然后传奇停止

我正在使用
链接
在页面之间导航。我也尝试了
browserHistory.push(url)
dispatch(push(url))
。同样的结果

注:我从中获得了注入传奇的代码。我只使用了这段代码,并没有使用样板文件本身。我运行了样板文件,但这个错误没有发生在那里。区别在于:

  • 它正在使用syncHistoryWithStore中的
    selectLocationState
    。我的整个商店不是一成不变的,所以我不需要它
  • 它使用自己的
    routeReducer
    而不是
    routerReducer
    from
    react router redux
    。我不知道为什么,可能是因为完整的不可变存储

无论如何,在锅炉板代码中,我删除了上述两点,但场景仍然没有发生。

路线有一个单一的重定向,因此位置更改将被发送两次,从而取消了传奇

{
    path: 'home',
    getComponent(nextState, cb) {
        require.ensure([], require => {...})
    },
    indexRoute: {
            onEnter: (nextState, replace) => replace('/home/A')
    }
}
解决此问题的方法:

我在onLeave钩子中为每个注入传奇的页面发送一个LEAVE_页面操作

onLeave: ()=> {
          store.dispatch({type: LEAVE_HOME_PAGE});
        }
在这一特殊行动的传奇观察中:

const watcher = yield race({
  loadRepos: take(SOME_HOME_PAGE_ACTION),
  stop: take(LEAVE_HOME_PAGE), // stop watching if user leaves page
});

“你曾经解决过这个问题吗?”安德烈·伊齐佐夫(AndreyCizov)是的,发布了一个答案。这就是我想到的。任何其他更好的解决方案都是值得赞赏的。我对saga收到自己的位置变更事件(该saga是从Onener发送的结果)有一个问题。虽然我的解决方案是一样的。非常感谢你的快速回答。