两种定时刷新逻辑

96 阅读1分钟

使用 setTimeout

这段代码的目的是在 searchRecords 请求完成后等待10秒再次执行 loop 函数。

let timer = null; 
const loop = async () => {
  if (timer) clearTimeout(timer); 
  try {
    const response = await searchRecords();
    // 可能需要对 response 做一些处理
  } catch (error) {
    console.error(error);
  }
  timer = setTimeout(loop, 10000); 
};

loop(); 

使用 setInterval

这段代码的目的是每隔10秒执行一次 searchRecords 函数,但是由于 await 的使用,它不能在普通函数中工作,应该在异步函数中。

let timer = null; 
const loop = async () => {
  if (timer) clearInterval(timer); 
  try {
    const response = await searchRecords();
    // 可能需要对 response 做一些处理
  } catch (error) {
    console.error(error);
  }
  timer = setInterval(searchRecords, 10000); 
};

loop(); 

然而,这里使用 setInterval 是不正确的,因为它会不断地重新注册定时器,而不是等待 searchRecords 完成。正确的做法是在 searchRecords 完成后使用 setTimeout,就像第一段代码那样。

总结

  • setTimeout 版本在每次请求完成后等待10秒再次发起请求,这样可以确保不会有重叠的请求。
  • setInterval 版本试图每隔10秒发起请求,如果 searchRecords 的执行时间超过了10秒,新的请求将在旧的请求完成之前开始,可能导致请求重叠和数据不一致的问题。

综上,如果你想避免这种情况,最好使用 setTimeout 版本。