首页 > 解决方案 > Javascript - 如何使用不在同一范围内的 onClick 事件侦听器清除回调内的 setInterval

问题描述

我想完成以下任务:


我成功地以 1 秒的间隔绘制了图表。但是我无法理解的是,当在回调中定义时,如何clearInterval在窗口上下文中进行操作。setInterval停止按钮的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了解更多信息。

提前致谢!

标签: javascripttimerpromisesetintervalintervals

解决方案


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


推荐阅读