Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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 为什么同步侦听子进程“;在”之后;产卵安全吗?_Javascript_Node.js - Fatal编程技术网

Javascript 为什么同步侦听子进程“;在”之后;产卵安全吗?

Javascript 为什么同步侦听子进程“;在”之后;产卵安全吗?,javascript,node.js,Javascript,Node.js,构造一个,然后听它 虽然这被认为是在Node.js(或者Javascript)中侦听可侦听文件(socket.iosockets也这么做)的正确方法,而且我知道这不会有任何问题,但我还是有点怀疑:为什么它从不错过任何事件?“ 我的理解是,事件可以在创建发射器后的任何时间异步发生。所以我想,“为什么不在监听(.on)之前发生呢?在调用.on方法之前,究竟是什么确保在监听之前不会发生任何事件?” 再做两次实验, > node test.js Failed to spawn a subproc

构造一个,然后听它

虽然这被认为是在Node.js(或者Javascript)中侦听可侦听文件(
socket.io
sockets也这么做)的正确方法,而且我知道这不会有任何问题,但我还是有点怀疑:为什么它从不错过任何事件?


我的理解是,事件可以在创建发射器后的任何时间异步发生。所以我想,“为什么不在监听(
.on
)之前发生呢?在调用
.on
方法之前,究竟是什么确保在监听之前不会发生任何事件?”

再做两次实验,

> node test.js
Failed to spawn a subprocess.
我发现只有当侦听器连接是同步的(我想时间并不重要)时,才有某种东西可以确保这一点,但我无法理解引擎盖下发生了什么,因为代码本身并没有告诉我为什么


我相信有人可以给我一个很好的语言规范方面的解释,或者引擎实现方面的解释。

错误事件在进程退出时发出,由“nextTick”函数处理(参见第1140行)

如果我正确地阅读了,nextTick允许我们“通过使用process.nextTick(),我们保证[…]总是在用户代码的其余部分之后和允许事件循环继续之前运行其回调。”

查看或
> node test.js
Failed to spawn a subprocess.
const subprocess = require("child_process").spawn("bad_command");
setTimeout(_ => subprocess.on("error", _ => {
    console.info("Failed to spawn a subprocess.");
}), 10);
> node test.js
events.js:180
      throw er; // Unhandled 'error' event
      ^

Error: spawn bad_command ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:264:19)
    at onErrorNT (internal/child_process.js:456:16)
    at processTicksAndRejections (internal/process/task_queues.js:77:11)
Emitted 'error' event at:
    at Process.ChildProcess._handle.onexit (internal/child_process.js:270:12)
    at onErrorNT (internal/child_process.js:456:16)
    at processTicksAndRejections (internal/process/task_queues.js:77:11) {
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn bad_command',
  path: 'bad_command',
  spawnargs: []
}
const subprocess = require("child_process").spawn("bad_command");
(function heavy_synchronous_task_that_takes_much_longer() {
    const Crypto = require("crypto");
    const buffer = Buffer.alloc(1_000_000);
    console.log(Date.now());
    for(let i = 0; i < 10_000; ++i) {
        Crypto.randomFillSync(buffer);
    }
    console.log(Date.now());
})();
subprocess.on("error", _ => {
    console.info("Failed to spawn a subprocess.");
});
> node test.js
1562646732809
1562646744631
Failed to spawn a subprocess.