请考虑以下代码。
const fs = require('fs');
let loops = 0;
function loop() {
fs.readdir(__dirname, () => {
loops++;
console.log('loop1 #' + loops);
loop();
});
}
loop();
setInterval(() => {
loops++;
console.log('loop2 #' + loops);
}, 100);
有两个异步循环递增相同的值。一个使用setInterval
,另一个使用节点的异步方法之一。如果使用基本node.js运行此命令并在任一回调中放置断点,则执行将按预期停止。
但现在将此代码放在boilerplate electron.js app的renderer.js
内,并在第二个循环中放置一个断点。
发生了一件奇怪的事情。
看起来,即使循环2暂停,循环1继续工作,将“loop1 #xxx”输出打印到控制台并更新共享内存。
仅当我在浏览器本机异步方法(setInterval
,setTimeout
)内暂停并观察节点原生效果时才会出现效果。所有其他组合(浏览器 - >节点,节点 - >节点,浏览器 - >浏览器)按预期暂停所有执行。
这怎么可能?这几乎就像电子有两个javascript运行循环,它们被焊接在一起,调试器只会影响“浏览器”的运行循环。
如果是这种情况,是否存在此行为的线程影响?我是否必须在节点和基于浏览器的回调之间共享的代码中添加锁?