Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未为ctrl-C(Mac)调用NodeJS应用程序中的SIGINT处理程序_Javascript_Node.js - Fatal编程技术网

Javascript 未为ctrl-C(Mac)调用NodeJS应用程序中的SIGINT处理程序

Javascript 未为ctrl-C(Mac)调用NodeJS应用程序中的SIGINT处理程序,javascript,node.js,Javascript,Node.js,我的代码: process.on('SIGINT', function() { console.log('Interrupted'); process.exit(); }); // A big loop here that takes several seconds to execute through. console.log('Exited without interruption'); 我从命令行运行程序,当程序仍在运行时,按ctrl+C。我立即返回到命令行。但是,conso

我的代码:

process.on('SIGINT', function() {
  console.log('Interrupted');
  process.exit();
});

// A big loop here that takes several seconds to execute through.

console.log('Exited without interruption');
我从命令行运行程序,当程序仍在运行时,按ctrl+C。我立即返回到命令行。但是,
console.log('Interrupted')
不会显示在输出中。经过一段时间后,将显示
console.log('Exited without interruption')
,证明当我点击ctrl+C时进程没有退出,而是在返回命令行后在后台继续运行

删除
process.on()
语句允许在按下ctrl+C时退出进程。(不输出“无中断退出”。)

尝试了
()=>{
函数(){
函数声明样式,结果相同

Mods,请不要太匆忙地将其标记为重复,当然,我很高兴被引用到一个有效的现有解决方案中。我看到了-响应ctrl+C的行为是不同的

// Begin reading from stdin so the process does not exit imidiately
process.stdin.resume();
process.on('SIGINT', function() {
  console.log('Interrupted');
  process.exit();
});

编辑:

//这里有一个大循环,需要几秒钟来执行

这是您的问题。NodeJS是单步执行的。当您执行同步循环时,会阻止事件循环,其他事件侦听器将无法同时工作

你可以:

  • 使循环异步(带有process.nextTick()的递归函数)
  • 为循环作业生成子进程(工作进程),则不会阻止主事件循环

  • 您可以尝试
    ()=>
    函数(信号)
    函数定义吗?我觉得我必须对类似的问题进行一些小的修改。是的,我尝试了这两种方法,但结果相同。感谢您的建议。将更新我的问题以表明我已经尝试过。预期的行为是否正确(没有“无中断退出”)与空函数一起出现?没有区别。我所做的ctrl+c编辑是由SO自动建议的,我认为它看起来很时髦。Re“预期行为是否与空函数一起出现?”是的,无论处理程序函数是空块还是包含上述处理代码,行为都是相同的。请尝试,谢谢。不会更改行为。注意,进程过早退出没有问题。可能这就是问题所在:所有平台都支持来自终端的SIGINT,并且通常可以使用+C生成(虽然这可能是可配置的)。启用终端原始模式时不会生成。让我修改上面的观察结果。通过添加stdin.resume()我可以看到一些新的情况发生。“中断”文本将显示,但只有在冗长的循环完成后才会显示。此时,需要按下一个键,然后我返回到命令行。因此,使用上述代码,处理程序将运行,但在按下ctrl+c后不会立即运行,并且ctrl+c不会停止进程。是的,这就是问题所在。很抱歉在回复之前等待了很长时间——我去度假了。我通过将工作构建为承诺链来解决问题——换句话说,按照您的建议,使循环异步。