setTimeout的工作量超出了我的预期

时间:2017-07-20 06:04:44

标签: javascript node.js

我有简单的js脚本:

const printDate = (interval) => {
  setTimeout(() => {
    console.log(new Date());
    printDate();
  }, interval);
};
printDate(1000);

我希望每1秒在控制台中看到1条记录,因为我以间隔(即1秒)传递1000。
但是当我运行这个脚本时,我会收到这样的内容:

km:gh kvol$ node test.js
2017-07-20T05:54:20.241Z
2017-07-20T05:54:20.244Z
2017-07-20T05:54:20.246Z
2017-07-20T05:54:20.247Z
2017-07-20T05:54:20.249Z
2017-07-20T05:54:20.250Z
2017-07-20T05:54:20.252Z
2017-07-20T05:54:20.253Z
2017-07-20T05:54:20.255Z
2017-07-20T05:54:20.256Z
2017-07-20T05:54:20.258Z
2017-07-20T05:54:20.259Z
2017-07-20T05:54:20.261Z
2017-07-20T05:54:20.262Z
2017-07-20T05:54:20.264Z
2017-07-20T05:54:20.265Z
2017-07-20T05:54:20.267Z
2017-07-20T05:54:20.268Z
2017-07-20T05:54:20.270Z
2017-07-20T05:54:20.271Z
2017-07-20T05:54:20.273Z
2017-07-20T05:54:20.274Z
2017-07-20T05:54:20.276Z
2017-07-20T05:54:20.277Z
2017-07-20T05:54:20.279Z
2017-07-20T05:54:20.280Z
2017-07-20T05:54:20.281Z
2017-07-20T05:54:20.283Z
2017-07-20T05:54:20.284Z
2017-07-20T05:54:20.286Z
2017-07-20T05:54:20.288Z
2017-07-20T05:54:20.290Z
2017-07-20T05:54:20.291Z
2017-07-20T05:54:20.293Z
2017-07-20T05:54:20.294Z
2017-07-20T05:54:20.296Z

3 个答案:

答案 0 :(得分:5)

您在递归调用中将undefined作为超时传递:printDate();interval将为undefined),这与传递0相同。

如果您想使用相同的超时,请传递interval

printDate(interval);

答案 1 :(得分:1)

在控制台上打印第一个日期后,您需要将间隔传递给printDate()函数。区间变量范围仅在第一次调用时可用,从第二次调用开始,没有定义区间,它只是简单地打印日期。

答案 2 :(得分:1)

正如Felix所说,间隔是未定义的,所以只有第一个超时有1000个值。如果您没有为setTimeout定义数字,它将使用您运行代码的环境的最小值。它可能是任何东西。最有可能在3-10毫秒之间。 https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Notes

视觉:

enter image description here

代码:



const printDate = (interval) => {
  setTimeout(() => {
    console.log(new Date());
    printDate(interval);
  }, interval);
};
printDate(1000);