javascript - IF Else 语句在 setInterval() 函数中无法正常工作

标签 javascript reactjs react-native setinterval

我在访问 if else 时遇到问题,if else 可以调用,但两个 block 同时调用 if block 和 else block

那么如果 else block 我怎样才能正常工作

我的代码是

const UserCard=(props)=>{


const[LiveOrdStatus,setStatus] = useState();
const[order_ID,setordid] = useState(props.orderId);

const labels=["Order","Confirm","Ready","Deliver","Delivred"];
let number = 0;

function LiveFetchData(){
   fetch('https://example.in/app/live_update.php', {
      method: 'POST',
      mode: 'no-cors',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        'S_KEY':'84014',
        'order_id':order_ID,
      })
    }).then((response) => response.json())
    .then((json) => {
      setStatus(json.order_status);
      //console.log(json.order_status);
    }).catch((err) => { console.log(err); });
}

LiveFetchData();
   setInterval(() => {
        if(LiveOrdStatus==="DELIVERED")
        {
         console.log("its okk :"+LiveOrdStatus);
        }else{
         console.log("not called :");
        }
  }, 10000);

 }

我的输出是 enter image description here

最佳答案

您正在每个渲染周期调用并设置一个间隔,据我所知,您永远不会清除任何间隔。您可能只想在安装组件时启动一个间隔。不要忘记在组件卸载时返回一个清理函数来清除任何运行间隔。

useEffect(() => {
  const timerRef = setInterval(() => {
    if (LiveOrdStatus === "DELIVERED") {
      console.log("its okk :", LiveOrdStatus);
    } else {
      console.log("not called :");
    }
  }, 10000);

  return () => clearInterval(timerRef);
}, []);

您还在函数体中直接调用LiveFetchData();,这将导致渲染循环,因为它也会更新状态。我不确定您希望何时调用此函数,但您可能还想将其放入 useEffect Hook 中。

useEffect(() => LiveFetchData(), []);

这将在组件安装时调用它一次,但如果您需要更频繁地调用它,那么您应该弄清楚任何依赖项是什么或添加额外的间隔计时器等...

更新

I am facing one more problem , when accessing LiveOrdStatus inside else than it show " not called : undefined "

是的,我现在明白这是怎么发生的了。基本上,初始 LiveOrdStatus 被封闭在 setInterval 回调范围内。

使用 React ref 缓存当前的 LiveOrdStatus 状态值并在时间间隔内访问该值。

    const LiveOrdStatusRef = React.useRef();

    useEffect(() => {
      LiveOrdStatusRef.current = LiveOrdStatus;
    }, [LiveOrdStatus]);

    useEffect(() => {
      const timerRef = setInterval(() => {
        if (LiveOrdStatus === "DELIVERED") {
          console.log("its okk :", LiveOrdStatusRef.current);
        } else {
          console.log("not called :", LiveOrdStatusRef.current);
        }
      }, 10000);

      return () => clearInterval(timerRef);
    }, []);

关于javascript - IF Else 语句在 setInterval() 函数中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68220341/

相关文章:

javascript - 使用 WCF REST 服务和 Javascript 中的流以及 URL 参数上传文件

javascript - Carousel slider - 如何流畅地制作卡片动画?

reactjs - create-react-app with --template typescript 不创建 .tsx 文件

javascript - useEffect 钩子(Hook)在初始渲染时调用,无需更改依赖项

reactjs - react JS : Modal component not rendering

javascript - 如何在浏览器中使用 superagent 将字符串作为文件发布

javascript - 如何覆盖我在循环内传递的数据

javascript - 路由器未在 Express 应用程序中触发 .find 或 .findByID。也使用 nextjs

android - 开发服务器返回响应错误码:404 react native

reactjs - 在 React Native 中渲染逗号分隔的值字符串