我在Node.js中使用Chrome Debug Protocol,程序接受用户的输入 作为代码并通过Chrome调试协议在Chrome中运行,就像下面的代码段一样:
const Chrome = require('chrome-remote-interface')
Chrome(async (client) => {
const {
Page,
Runtime
} = client
try {
await Promise.all([
Page.enable(),
Runtime.enable()
])
Runtime.evaluate({ expression: `while (1) {}` })
} catch (e) {
console.log(e)
}
})
但如果代码具有像while (1) {}
这样的无限循环,则Chrome的标签将永远保持不变。有没有办法以编程方式退出无限循环(或只是简单地停止运行的JavaScript)而不是杀死进程?
答案 0 :(得分:1)
简短回答:不,JavaScript是单线程运行时。一次只能执行一段代码。
答案很长:是的,如果你编写了一个非阻塞循环机制,它将控制释放到事件循环中。如果执行堆栈从未有机会清除(例如while(true){}),则控制永远不会释放到事件循环,并且无法运行其他代码。这种防止额外的代码执行被称为阻止。
使用您的基本示例,如果循环是这样编写的,则可以中断该过程:
(function loop() {
// code here...
setTimeout(loop); // release execution to the event loop...
})();