Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
392 views
in Technique[技术] by (71.8m points)

求助一到笔试题,重写setInterval的方法

created() {
  this.interval = setInterval(async () => {
      const resp = await getNewStatistics();
      this.rows = resp.rows;
    }, 500);
}

destroyed() {
  clearInterval(this.interval);
}

其中getNewStatistics()是访问后端的异步操作

  1. 发现异步操作getNewStatistics()返回速度有点慢, 导致操作出现堆积, 现要求实现一个函数 setIntervalWaitable(callback, ms) 代替上述代码中的setInterval,要求异步函数callback完成后,等待ms的时间,再重新执行callback
  2. 将1中的setIntervalWaitable函数的行为修改为如下方式该怎么实现:
  • 等待传入的ms时间,如果此时callback已经完成,重新执行callback
  • 否则,等待callback完成,之后立刻重新执行callback
  1. (选答)为上面实现的setIntervalWaitable函数提供一个可停止实现,用于代码中的destroyed()方法当中

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

看着是个 setInterval,实际是个 setTimeout

function setIntervalWaitable(callback, ms = 0) {
  // 参数校验省略
  const fn = (async () => {
    try {
      await callback();
    } catch (err) {
      console.error(err);
    }
    
    setTimeout(fn, ms); // 递归调用
  });
  
  setTimeout(fn, ms); // 立即触发一次
}

测试结果(模拟 AJAX 请求阻塞 5 秒,上一次请求结束后等 5 秒再开始下一次,即 5+5=10):

image.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share

2.1m questions

2.1m answers

63 comments

56.6k users

...