setInterval 阻塞的话是不是等待里面的action?

Does setInterval wait for the action inside if it is blocking?

你好,我有一个功能如下

let schedule = setInterval(() => {
    result = execSync(command).toString()
}, 2000)
  1. 如果 execSync 需要超过 2000 次才能解决,setInterval 是否仍会重复或将 同步execSync 将使 setInterval 等待它先完成

两者兼而有之:

如果 execSync 需要 2000 毫秒,这意味着 没有其他代码 会在那 2 秒内 运行。毕竟,JavaScript 是单线程的,而您正在阻塞该线程。

execSync 完成后(并且它所在的函数调用完成),事件循环继续。由于自上次间隔发生以来已经过去了 2 秒,下一次调用将几乎立即发生。

您可以自己快速验证(例如在 REPL 中):

execSync = require('child_process').execSync;
setInterval(() => { console.log('a', Date.now()); execSync('sleep 2'); console.log('b', Date.now()); }, 2000);

同样有趣的是:如果您改为睡眠 5 秒,结果将是相同的(如果您忽略更长的冻结时间)。就像在execSync完成后,它不会突然同时触发两个任务。验证:

execSync = require('child_process').execSync;
i = 0;
setInterval(() => { console.log('a', Date.now()); if (i++ > 5) return; execSync('sleep 5'); console.log('b', Date.now()); }, 2000)