Javascript 在D3.js中设置超时

Javascript 在D3.js中设置超时,javascript,d3.js,Javascript,D3.js,我试图在D3.js中实现缩放行为,方法如下 块中有一段代码,我不明白。我知道setTimeout的行为,但不确定它是如何和为什么这样使用的,以及它如何与代码的其余部分相适应 我已经尝试过仔细地调试和检查每个断点,但我不明白它的主要目的,也不明白每个阶段都发生了什么 function brushended() { var s = d3.event.selection; if (!s) { if (!idleTimeout) return idleTimeout = setTimeo

我试图在D3.js中实现缩放行为,方法如下

块中有一段代码,我不明白。我知道
setTimeout
的行为,但不确定它是如何和为什么这样使用的,以及它如何与代码的其余部分相适应

我已经尝试过仔细地调试和检查每个断点,但我不明白它的主要目的,也不明白每个阶段都发生了什么

function brushended() {
  var s = d3.event.selection;
  if (!s) {
    if (!idleTimeout) return idleTimeout = setTimeout(idled, idleDelay);
    x.domain(x0);
    y.domain(y0);
  } else {
    x.domain([s[0][0], s[1][0]].map(x.invert, x));
    y.domain([s[1][1], s[0][1]].map(y.invert, y));
    svg.select(".brush").call(brush.move, null);
  }
  zoom();
}

function idled() {
  idleTimeout = null;
}

不确定这类问题(解释一段代码)是否适合堆栈溢出,但我真的想了解这里发生了什么,而不仅仅是复制粘贴解决方案。如果有人能解释这一点,那就太好了。谢谢。

我认为空闲超时部分的目的是,当用户双击鼠标时,将光标移到原始视图。i、 e.当点击分开时,它不会放大,而是缩小。 通过添加我在下面展示的两个控制台日志语句,您可能会发现更清楚地理解这些代码。尝试双击,然后在单击过程中稍微移动光标

function brushended() {
  var s = d3.event.selection;
  if (!s) {
    if (!idleTimeout) return idleTimeout = setTimeout(idled, idleDelay);
    x.domain(x0);
    y.domain(y0);
  } else {
    console.log('zoom set')
    x.domain([s[0][0], s[1][0]].map(x.invert, x));
    y.domain([s[1][1], s[0][1]].map(y.invert, y));
    svg.select(".brush").call(brush.move, null);
  }
  zoom();
}

function idled() {
    console.log('idled')
    idleTimeout = null;
}

很高兴你问这个问题。我当时也在同一条船上。最后,我想我从下面的回答中得到了一些理解。我希望Mike Bostock的代码得到更好的评论。