【问题标题】:Cancel some redux sagas when navigating导航时取消一些 redux sagas
【发布时间】:2018-06-28 20:47:03
【问题描述】:

我在这里遇到了一个复杂的问题,我们将非常感谢您的帮助。当我导航到我的应用程序的不同页面时,一些服务会响应错误并且我在不同的页面中看到这些错误。 例如,假设我想买东西,为此我调用了一个处理此任务的 saga。然后我立即注销,我在登录时看到错误。当我更改屏幕时,我想取消当前页面中运行的所有 sagas 期望。 为了解决这个问题,我做了一个动作,当用户从一个屏幕切换到另一个屏幕时调度。此操作正在调用生成器函数:

function* taskCancelHelper(actions, sagas) {
.....
}

我的第一个问题是如何“采取”所有期望从当前屏幕中调度的操作并调用适当的 sagas 的操作。我用过:

const action = take(action => [..actions in the current screen].indexOf(action.type) < 0); but it does not seem to work.

然后我想将在调度此操作时调用的所有 sagas [上述操作的 sagas] 传递到一个数组中。我的想法是在我的 taskCancelHelper* 生成器函数中传递这两个数组并使用 for 循环来取消每个任务:

For (i=0; i < actions.length; i++) {
   yield cancel(sagas[i])
}

你知道如何从当前屏幕执行所有调用 sagas 的操作吗?

【问题讨论】:

    标签: javascript generator helper redux-saga


    【解决方案1】:

    要取消LOCATION_CHANGE 上的 saga,您可以执行以下操作:

     import { LOCATION_CHANGE } from 'react-router-redux';
     import { takeLatest, put, fork, take, cancel } from 'redux-saga/effects';
     import { FETCH_DATA } from './constants';
    
     export function* dataFetch(action) {
       try {
         // make an api call
       } catch(error) {
         console.log(error);
       }
     }
    
     export function* defaultSaga() {
       const loadDataWatcher = yield fork(takeLatest, FETCH_DATA, dataFetch);
    
       yield take(LOCATION_CHANGE);
       yield cancel(loadDataWatcher); // Will cancel your saga
     }
    
     export default defaultSaga;
    

    【讨论】:

    • 非常感谢您的回答!您知道我如何执行屏幕中调度的所有操作吗?
    • 你能说得更具体点吗?
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2018-10-03
    • 2020-01-06
    相关资源
    最近更新 更多