如何以编程方式打破Chrome调试协议的JavaScript无限循环?

时间:2017-04-18 01:56:33

标签: javascript node.js google-chrome

我在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)而不是杀死进程?

1 个答案:

答案 0 :(得分:1)

简短回答:不,JavaScript是单线程运行时。一次只能执行一段代码。

答案很长:是的,如果你编写了一个非阻塞循环机制,它将控制释放到事件循环中。如果执行堆栈从未有机会清除(例如while(true){}),则控制永远不会释放到事件循环,并且无法运行其他代码。这种防止额外的代码执行被称为阻止

使用您的基本示例,如果循环是这样编写的,则可以中断该过程:



(function loop() {
  // code here...
  setTimeout(loop); // release execution to the event loop...
})();