如何杀死传奇动作?

问题描述

我有一个问题,我对用户进行身份验证,完成身份验证后,我将执行一些操作。

其中一些动作会在一段时间后执行,例如60000毫秒。

喜欢:

yield delay(60000);
yield put(myAction);

现在,当用户注销时,在60000之前,假设他在5秒钟内登录并立即注销,然后再次登录,则上一次操作将在数学上经过55秒后执行,因为它没有被杀死,所以该过程在后台,它将在5秒钟内再次执行(第二次登录后的新操作)。

我希望注销后,一些等待执行的操作消失了并停止在后台运行。

有什么想法吗?任何帮助将不胜感激。

解决方法

其中一种选择是使用race效果。

它指示中间件在多个效果之间运行 Race 。解决 Race 时,中间件自动取消所有失败的 效果

因此,您可以在身份验证处理程序和注销侦听器之间建立竞争:

function* authenticate() {
  // ...
  yield delay(60000);
  yield put(myAction);
}

function* handleAuthRequest() {
  yield race([
    authenticate(),take(LOGOUT),]);
}
如果在完成之前分派authenticate动作,则

LOGOUT将被取消。


如果您在多个地方都需要这样做,则可以创建可重复使用的包装器。像这样:

const withCancel = (saga,cancelPattern) =>
  function* cancelWrapper(...args) {
    yield race([
      take(cancelPattern),saga(...args),]);
  };