我有一个问题,我对用户进行身份验证,完成身份验证后,我将执行一些操作。
其中一些动作会在一段时间后执行,例如60000毫秒。
喜欢:
yield delay(60000);
yield put(myAction);
现在,当用户注销时,在60000之前,假设他在5秒钟内登录并立即注销,然后再次登录,则上一次操作将在数学上经过55秒后执行,因为它没有被杀死,所以该过程在后台,它将在5秒钟内再次执行(第二次登录后的新操作)。
我希望注销后,一些等待执行的操作消失了并停止在后台运行。
有什么想法吗?任何帮助将不胜感激。
答案 0 :(得分:0)
其中一种选择是使用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),
]);
};