Javascript - 如何使用不在同一范围内的 onClick 事件监听器清除回调内的 setInterval

标签 javascript timer promise setinterval intervals

我想完成以下任务:

  • 按顺序发送 10 个提取请求,并测量每个请求的响应时间(以毫秒为单位)
  • 对于每个请求,将响应时间推送到数组
  • 点击开始按钮 - 使用预定义函数开始绘制点:drawChart(data)。点应以 1 秒的间隔添加。
  • 点击停止按钮 - 停止绘图。
<小时/>

我成功地以 1 秒的间隔绘制了图形。但是我无法集中注意力的是当 setInterval 时如何在窗口上下文中 clearInterval是在回调中定义的。停止按钮的 onclick 不会具有 setInterval 的范围。

onLoad 事件监听器:

window.onload = async function () {
   drawChart([]);
   const data = await fetchData(15);
   document.getElementById("start").onclick = () => plotData(data);

   // I want to be able to clearInterval on click of Stop button... but its not working...
   document.getElementById("stop").onclick = clearInterval(plotData);  
};

绘图/获取函数:

const plotData = (data) => {
  let i = 0;
  // How do i clear this interval outside of this function?
  const interval = setInterval( () => {
    i++;
    if (i === data.length) { clearInterval(interval); }
    let newData = data.slice(0,i);
    drawChart(newData); 
    console.log('draw');
  }, 1000);
}

const fetchData = async (times) => {
  let url = `https://s3-us-west-2.amazonaws.com/s.cdpn.io/t-1295/lounging-dog.jpg`;
  const data = [];
  for (let i = 0; i < times; i++) {
    start = (new Date()).getTime();
    await fetch(url)
      .then( res => {
        end = (new Date()).getTime();
        console.log('times', i+1);
        console.log('response milisec', end - start);            
        data.push({ xVal: i+1, yVal: end-start}); 
      })
      .catch( e => console.log(e));   
  }
  return data;
};

您还可以查看我的CodePen了解更多信息。

提前致谢!

最佳答案

这似乎是一个范围问题。您需要在两个函数之外定义间隔。然后它位于函数的父范围内,因此它们都可以访问它。您现在的方式只允许从 plotData 内访问 interval。 此外,它需要是 letvar 因为每次单击相关按钮启动它时它都会被设置,并且 const不允许重新分配

关于Javascript - 如何使用不在同一范围内的 onClick 事件监听器清除回调内的 setInterval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57930053/

相关文章:

javascript - 如何使用java脚本过滤后避免两个数组中的重复对象

timer - 如何在不重新启动应用程序的情况下设置 QTimer 间隔以动态更改

javascript - 如何在执行函数之前加载一些图像

javascript - 通过单击按钮将选定值从选择框中复制到剪贴板?

javascript - REGEX 前瞻问题

javascript - 在新窗口中打开网页的 HTML 基本按钮代码

javascript - 个人最佳记分员/计时器

asp.net - 如何防止asp :Timer from sending tick before response is generated?

ios - 如何在iOS中干净利落地封装并依次执行一系列后台任务?

javascript - 避免使用 angular、HttpClient 和 Observables 的回调 hell