setInterval 阻塞的话是不是等待里面的action?
Does setInterval wait for the action inside if it is blocking?
你好,我有一个功能如下
let schedule = setInterval(() => {
result = execSync(command).toString()
}, 2000)
- 如果 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)
你好,我有一个功能如下
let schedule = setInterval(() => {
result = execSync(command).toString()
}, 2000)
- 如果 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)