官方API 中 server.listen() 的一个 demo的疑惑
发布于 1个月前 作者 gvforjob 278 次浏览 来自 问答

官方API的 net.Server 中 server.listen 有个 demo

server.on('error', function (e) {
  if (e.code == 'EADDRINUSE') {
    console.log('Address in use, retrying...');
    setTimeout(function () {
      server.close();
      server.listen(PORT, HOST);
    }, 1000);
  }
});

error 事件触发之后不是会马上触发 close 事件的么?在 setTimeout 的回调中加入 server.close() 不仅多余,而且如果 server 已经 close 掉不是还是抛出异常?

2 回复

看起来是这样:调用server.close()方法会关闭server,如果成功关闭,触发close事件。官网对close()的解释如下:

server.close([callback]) Stops the server from accepting new connections and keeps existing connections. This function is asynchronous, the server is finally closed when all connections are ended and the server emits a ‘close’ event. Optionally, you can pass a callback to listen for the ‘close’ event.

@GuoZhang

Event: 'error’# Error Object Emitted when an error occurs. The ‘close’ event will be called directly following this event. See example in discussion of server.listen. 可Server的error事件中说close事件会directly执行,我找源码没找出,但估计是在process.nextTick中执行的。如果是这样的话,那么在setTimeout延迟到来之前server已经被close了

回到顶部