调度触发后使用状态

Posted

技术标签:

【中文标题】调度触发后使用状态【英文标题】:Using state after dispatch has fired 【发布时间】:2020-02-01 04:40:21 【问题描述】:

我需要能够在使用 dispatch 更新我的 useReducer 状态后立即执行操作。但是调度运行异步,所以当我运行我的下一段代码时,它使用调度应该更新它之前的旧状态。

我尝试过使用 useEffect(()=>,[state]),但它只会在每次状态更新时运行。我需要根据条件执行某些操作……而不仅仅是每次状态更新。

// Let's update some stuff on the server with new data!
  const handleFinishOrder = () => 

    dispatch( type: "finish-order", payload: id ); // Set some fields to null

    socket.emit("request-update-live-data", state); // Old state gets sent to server :(
  ;

我希望在将状态发送到服务器时更新状态,但实际发送的状态是旧状态。

【问题讨论】:

【参考方案1】:

dispatch 是异步处理的,API 不提供在dispatch 执行后执行一段代码的任何方式。

实际上,如果您尝试将回调函数传递给dispatch,它会特别警告:

警告:来自 useState() 和 useReducer() Hooks 的状态更新 不支持第二个回调参数。执行副作用 渲染完成后,在组件体中使用 useEffect() 进行声明。

因此,您应该在 useEffect 中使用适当的依赖项列表执行 socket.emit

或者,您可以在您的减速器函数中针对特定的操作类型执行此操作。

【讨论】:

【参考方案2】:

我遇到了同样的问题,我使用 useEffect 钩子解决了这个问题

const handleFinishOrder = () => 
    dispatch( type: "finish-order", payload: id );  
 ;
  
  
useEffect(() => 
    socket.emit("request-update-live-data", state);
, [state]);

这仅适用于特定情况,因为每当状态更新时都会执行操作,在大多数情况下正确的解决方案是使用 useEffect 和 useState 挂钩

const [someState, setSomeState] = useState("ainitialState");


const handleFinishOrder = () => 
    setSomeState("new value")  
 ;
  
  
useEffect(() => 
    socket.emit("request-update-live-data", someState);
, [someState]);

【讨论】:

以上是关于调度触发后使用状态的主要内容,如果未能解决你的问题,请参考以下文章

由 Windows 任务调度程序触发

Quartz浅析

调度操作后 Redux 状态未更新

Python任务调度模块 – APScheduler

Redux 状态在下一个 js 调度后不会改变

在通过动作调度进行状态更新后,在 React 中使用 Redux 执行函数?