为什么要同步听一个子过程“后”产卵被认为是安全的


const subprocess = require("child_process").spawn("bad_command");
subprocess.on("error", _ => {
    console.info("Failed to spawn a subprocess.");
});
> node test.js
Failed to spawn a subprocess.

构造一个,,然后听它。

虽然这被认为是听听 Linables 的正确方法(socket.io插座也可以。(它不会毫无问题地工作,但我脑海中有点怀疑:" 出于什么原因永远不会错过任何事件?"


我的理解是,事件可能会异步在发射器的创建中发生在上。因此,我想像"为什么不在聆听之前(.on(向他们进行什么到底确保在调用.on方法之前不会发生任何事件?"

还有两个实验

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.

我在那里发现可以确保它的东西,只有当听众跟踪是同步的时(我猜时机没关系。(,但是我无法掌握引擎盖下的情况,因为代码代码本身不会告诉我有关原因的任何信息。

我相信可以给我一个良好的语言特定 - 方向或发动机 - 实践 - 解释。

错误事件是在过程退出时发出的,该事件由" nexttick"函数处理(请参见此处的1140行(。

NextTick,如果我要正确读取事件循环文档,则允许我们"使用process.nexttick((我们保证[...]在其余的用户代码之后和之前始终运行其回调允许事件循环继续。"

最新更新