我在这里面临着一个复杂的问题,我们将不胜感激。何时,我导航到应用程序的不同页面,某些服务响应出现错误,并且我在不同页面中看到该错误。
例如,假设我要购买东西,为此,我称它为处理此任务的传奇。然后我立即注销,登录时看到错误。当我更改屏幕时,我想取消当前页面中正在运行的所有预期结果。
为了解决这个问题,我进行了一个操作,当用户从一个屏幕切换到另一个屏幕时,将分派该操作。此操作正在调用生成器函数:

function* taskCancelHelper(actions, 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的所有操作吗?

最佳答案

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

 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;

07-24 17:30