【问题标题】:Redux Thunk - Is it possible to cancel a setTimeoutRedux Thunk - 是否可以取消 setTimeout
【发布时间】:2019-07-12 15:17:22
【问题描述】:

我想实现一个通知系统,在用户发出 API 请求后创建一条消息。但是我不想在屏幕上创建多条消息,并且想取消以前的消息,只显示最近的一条。最近了解了 thunk 及其使用,想知道是否可以取消 setTimeout 或者是否有更好的方法来实现它。

这是我计划使用的 thunk 消息。

export const startNotification = (message) => {
  return dispatch => {
    setTimeout(() => {dispatch(notificationMessage(message))}, 5000);
  };
};

我不确定解决此问题的方法。我正在考虑的一种方法是更新我的减速器以处理多条消息,但似乎这会使减速器过于复杂。理想情况下,我想取消任何现有的超时,然后再次调用函数。有没有办法实现这一点,还是有更好的替代方案来实现我想要实现的目标?

【问题讨论】:

    标签: reactjs redux react-redux redux-thunk


    【解决方案1】:

    setTimeout() 返回一个句柄,您可以使用clearTimeout() 取消该句柄,这是一种选择。

    但是,我建议清除减速器中以前的消息。每当您的通知缩减程序收到一条新消息时,它就可以删除任何其他消息。

    如果您最终使用clearTimeout(),您可以在https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearTimeout 找到更多信息

    【讨论】:

    • 来自网站,clearTimeout() 需要一个 timeoutID。所以如果我把代码改成const timer = setTimeout(...);然后clearTimeout(timer),这会清除当前运行的所有setTimeouts吗?
    • 每次您拨打setTimeout() 时,您都会获得一个新句柄。调用 clearTimeout(timer) 只会取消 setTimeout() 的单个实例
    • 谢谢。我想最干净的方法是处理 reducer 中的消息。
    • 没问题。这并不完全适合您的用例,但这就是我在一个辅助项目中敬酒的方式。我一次显示不止一个,但减速器确实可以处理多个 toast。 gist.github.com/raddeus/4a37ddae68a89ea0a893dd08f6456ee8
    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2016-09-19
    • 2017-05-28
    相关资源
    最近更新 更多