Javascript 为什么在最后调用回调函数以及如何测试该函数?

Javascript 为什么在最后调用回调函数以及如何测试该函数?,javascript,d3.js,Javascript,D3.js,我有一个在点击按钮时被调用的函数,它依次调用计时器中的另一个函数 代码如下: <button id="starter">Start</button> 这是你的电话号码 为什么d3定时器及其内部函数的调用要晚于它下面的控制台消息?如何在控制台消息之前调用它,以及如何在Jasmine中为此类函数编写测试?这是预期的行为 D3定时器不同于setTimeout和setInterval:除此之外,它们在页面背景时停止 但是,正如使用0 ms的setTimeout时所发生的情况一样

我有一个在点击按钮时被调用的函数,它依次调用计时器中的另一个函数

代码如下:

<button id="starter">Start</button>
这是你的电话号码


为什么d3定时器及其内部函数的调用要晚于它下面的控制台消息?如何在控制台消息之前调用它,以及如何在Jasmine中为此类函数编写测试?

这是预期的行为

D3定时器不同于
setTimeout
setInterval
:除此之外,它们在页面背景时停止

但是,正如使用0 ms的
setTimeout
时所发生的情况一样,您看到的行为是这样解释的:设置最小延迟并不意味着函数将立即执行:它只是意味着将在当前执行的代码完成后立即执行

我们可以使用
d3.timeout
(在v3中不存在,仅在v4中存在),这与
d3.timer
不同,timer只调用一次。请查看控制台:

d3.选择(“按钮”)。在(“单击”,函数()上){
d3.超时(函数(){
log(“我在d3.timeout内,我应该先来!”)
});
log(“我在d3.timeout之外并且在它之后”)
log(“我在d3.timeout之外,也在它之后”)
})


单击我
计时器是异步的,JavaScript是单线程的。这意味着在时间到了并且当前正在运行的线程完成之前不会调用回调。关于其他两个问题,请在每篇文章中只保留一个问题。在Stack Overflow(堆栈溢出)结束时,每篇文章都要问一个以上的问题。请记住:)解释很有帮助。干杯
document.getElementById ("starter").addEventListener ("click", myFunction, false);

function myFunction() {
  var start = new Date().getTime();
  console.log("Start", start);
  d3.timer(() => {
    var timepassed = new Date().getTime() - start;
    console.log("Time elapsed", timepassed);
    helloBlah(timepassed);
    if(timepassed >= 200) return true;
  });
  console.log(" Why am I triggered first rather than the timer?");
}

function helloBlah(e){
  console.log("Hello Blah");
}