代码之家  ›  专栏  ›  技术社区  ›  Diego Oliveira

在取消redux saga后不调用操作

  •  2
  • Diego Oliveira  · 技术社区  · 7 年前

    调用CANCEL_SEARCH时,我正在取消一个传奇动作:

        function* cancelWorkerSaga(task) {
          console.log(task);
          yield cancel(task);
        }
    
        export default function* sagaFlights() {
         const workerTask = yield takeLatest(GET_FLIGHTS, getFlights);
         yield takeLatest(CANCEL_SEARCH, cancelWorkerSaga, workerTask);
        }
    

    取消操作工作正常,但当我导航到主屏幕并尝试进行新搜索时,getFlights操作不再被调用。我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Martin Kadlec    7 年前

    任务从返回 takeLatest 是侦听操作的观察者任务 GET_FLIGHTS getFlights 传奇故事因为观察者是 飞行 佐贺,取消它就会取消 也

    为了避免取消监视程序,您可以替换 具有自定义循环,因此您可以访问

    export default function* sagaFlights() {
        yield takeLatest(GET_FLIGHTS, function*(...args) {
            yield race([
                call(getFlights, ...args),
                take(CANCEL_SEARCH)
            ]);
        });
    }
    

    如果您经常需要此模式,可以创建一个简单的实用程序函数来隐藏逻辑:

    const cancelable = (saga, cancelAction) => function*(...args) {
      yield race([call(saga, ...args), take(cancelAction)]);
    };
    
    function* rootSaga() {
      yield takeLatest(GET_A, cancelable(getA, CANCEL_A));
      yield takeLatest(GET_B, cancelable(getB, CANCEL_B));
    }