导航时取消一些redux sagas

时间:2018-01-19 15:05:54

标签: javascript generator helper redux-saga

我在这里面临一个复杂的问题,我们将非常感谢您的帮助。什么时候,我正在导航到我的应用程序的不同页面,一些服务响应有错误,我看到不同页面中的错误。 例如,假设我想购买一些东西,为此我称之为处理此任务的传奇。然后我立即退出,我在登录时看到一个错误。当我改变屏幕时,我想要取消当前页面中运行的所有期望。 为了解决这个问题,我做了一个动作,当用户从一个屏幕切换到另一个屏幕时,该动作被调度。此操作正在调用生成器函数:

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

我的第一个问题是如何“接受”当前屏幕中调度的所有操作以及调用适当的传奇。我用过:

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

然后我想把这个动作发送时所调用的所有传奇都传递给一个数组[上述动作的传奇]。我的想法是在我的taskCancelHelper *生成器函数中传递这两个数组,并使用for循环来取消每个任务:

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

你知道如何采取当前调用传奇的屏幕所期望的所有动作吗?

1 个答案:

答案 0 :(得分:1)

为了取消LOCATION_CHANGE上的传奇,您可以执行以下操作:

 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;