Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待状态使用UseState钩子更新,然后在函数内运行代码_Javascript_Node.js_Reactjs_React Hooks - Fatal编程技术网

Javascript 等待状态使用UseState钩子更新,然后在函数内运行代码

Javascript 等待状态使用UseState钩子更新,然后在函数内运行代码,javascript,node.js,reactjs,react-hooks,Javascript,Node.js,Reactjs,React Hooks,我有一个功能部件 单击“开始”按钮时会调用Startive函数。。。此函数用于更新状态,然后执行后面提到的代码 但它在setlivechartstate尚未完成更新时运行 我不想使用use effect hook,因为我只想在单击按钮时运行代码,因为它同时作为start和stop运行,并且liveActive在其他函数中也发生了更改。。因此,将useEffect与此依赖项一起使用会产生问题 我能让这个函数工作并且只在更新完成后运行代码的最佳方法是什么如果您使用useffect会更好。对于您的问题

我有一个功能部件

单击“开始”按钮时会调用Startive函数。。。此函数用于更新状态,然后执行后面提到的代码

但它在setlivechartstate尚未完成更新时运行

我不想使用use effect hook,因为我只想在单击按钮时运行代码,因为它同时作为start和stop运行,并且liveActive在其他函数中也发生了更改。。因此,将useEffect与此依赖项一起使用会产生问题


我能让这个函数工作并且只在更新完成后运行代码的最佳方法是什么

如果您使用
useffect
会更好。对于您的问题,您可以在
useffect
中检查,如果单击按钮
:true
,则只有
useffect
将执行您的更新代码

const startLive = () => {
    // connect to websocket only on start button
    
     setliveChartState({
      ...liveChartState,
      liveActive: !liveChartState.liveActive,
      historicLiveActive: true,
      start: new Date(),
    });

/*- - - -after updation this code needs to run - - - >*/
    const { ws, liveActive } = liveChartState;
    
    // if clicked on stop then close websocket
    if (!liveActive && ws) {
      ws.close();
    clearLiveInterval();
    }
    // if clicked on  start and websocket close then connect
    if ((!ws || ws.readyState === WebSocket.CLOSED)&& liveActive) connect();
    fetchData("historic");

/*----------*/
  };

考虑到您的用例,如果您了解异步/等待函数和。在我看来,执行更新的一个好方法是将您的
setliveChartState()
函数包装在一个异步函数中,类似于:

异步函数setLiveChart(){ setliveChartState(…) } 然后在
const startive=()=>{}
中调用
async setLiveChart()
函数,如下所示:

const startive=()=>{
//仅在“开始”按钮上连接到websocket
setLiveChart()。然后(()=>{
/*-------更新后,此代码需要运行---->*/
const{ws,liveActive}=liveChartState;
//如果单击停止,则关闭websocket
如果(!liveActive&&ws){
ws.close();
clearLiveInterval();
}
//如果单击开始并关闭websocket,则连接
如果(!ws | | ws.readyState==WebSocket.CLOSED)和&liveActive)connect();
获取数据(“历史”);
/*----------*/
}
};
您还可以链接多个
then()
回调,如

setLiveChart()
.然后(()=>{})
.然后(()=>{})
.然后。。。

你可以有一个状态变量,它会在点击按钮时发生变化,你可以对该变量产生有用的影响,这样你只会在点击按钮时触发该功能,这回答了你的问题吗?嘿…这正是我试图做的…我不知道为什么它不起作用“``const set=async()=>{setliveChartState({…liveChartState,liveActive:!liveChartState.liveActive,HistoricCliveActive:true,start:new Date(),};};const startive=()=>{//仅在开始按钮控制台上连接到websocket。log(liveChartState.liveActive,“一”);set()。然后(()=>{update};}```
useEffect(() => {
 if (ButtonClicked) {
   // do updation stuff
  }
}, [ButtonClicked]);