while 循环在 useEffect 挂钩中不起作用

Posted

技术标签:

【中文标题】while 循环在 useEffect 挂钩中不起作用【英文标题】:while loop is not working in useEffect hook 【发布时间】:2021-11-14 19:32:26 【问题描述】:

我想每 7 秒获取一次设备位置设置设置当前位置值的状态。我在 useEffect 钩子中创建了一个 while 循环,并使用 setTimeot 等待 7 秒。但是 while 循环永远不会执行。这种方法有什么问题,我该如何解决?

const sleep = (milliseconds) => 
    setTimeout(() =>  , milliseconds)



const getPosition = () => 
    
        while (true) 
            GetLocation.getCurrentPosition(
                enableHighAccuracy: true,
                timeout: 15000,
            )
                .then(location => 
                    const  latitude, longitude, altitude, accuracy  = location
                    setPosition( lat: latitude, lon: longitude, alt: altitude, acc: accuracy )
                    alert("latitude: " + latitude + "\nlongitude: " + longitude)
                    setLoading(false)
                )
                .catch(err => alert(err))
            sleep(7000)
        
          



useEffect(() => 
    getPosition()

, [])

【问题讨论】:

【参考方案1】:

我不是 100% 了解为什么 whuile(true) 不起作用... 但是你为什么不使用“setTimeout的兄弟”setInterval

const getPosition = () => 
  GetLocation.getCurrentPosition(
    enableHighAccuracy: true,
    timeout: 15000,
  )
    .then((location) => 
      const  latitude, longitude, altitude, accuracy  = location;
      setPosition(
        lat: latitude,
        lon: longitude,
        alt: altitude,
        acc: accuracy,
      );
      alert('latitude: ' + latitude + '\nlongitude: ' + longitude);
      setLoading(false);
    )
    .catch((err) => alert(err));
;

useEffect(() => 
  const intervalID = setInterval(getPosition, 7*1000);

  // Don't forget to clear the interval when unmounting the component :
  return () => 
    clearInterval(intervalID);
  ;
, []);

【讨论】:

完全按照我的意愿工作。谢谢。【参考方案2】:

下面是使用setTimeout 的方法。

下面的文章解释了选择一个而不是另一个的一些微妙之处。

TLDR setTimeout 通常是更好的选择

Repeated Events: Timeout or Interval?

const loopInterval = 7*1000;
let loop;

const getPosition = () => 
  GetLocation.getCurrentPosition(
    enableHighAccuracy: true,
    timeout: 15000,
  )
  .then((location) => 
    const  latitude, longitude, altitude, accuracy  = location;
    setPosition(
      lat: latitude,
      lon: longitude,
      alt: altitude,
      acc: accuracy,
    );
    alert('latitude: ' + latitude + '\nlongitude: ' + longitude);
    setLoading(false);
    loop = setTimeout(getPosition, loopInterval);
  )
  .catch((err) => alert(err));
;

useEffect(() => 
  loop = setTimeout(getPosition, loopInterval);
  // Clear the timeout when unmounting the component :
  return () => 
    clearTimeout(loop);
  ;
, []);

【讨论】:

以上是关于while 循环在 useEffect 挂钩中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 while 循环中的条件在 python 中不起作用?

While循环在ResultSet java中不起作用

警报(int)在while循环中不起作用

R Sys.sleep 打印在 while 循环中不起作用

SQL查询在while循环中不起作用 - JAVA

std::cin 在 do-while 循环中不起作用