Node.js – 如果我调用response.end而I / O和callback仍在运行会发生什么?

在Node.js中,如果在我的I / O调用和/或callback仍在执行时调用“response.end()”会发生什么? 如下所示:

var app = http.createServer(function(request, response) { response.writeHead(200, { 'Content-Type': 'text/plain'}); fs.writeFile('baz', 'contents', function() { myOtherFunc(); response.end('Second response.end'); }); response.end('First response.end'); }); 

特别:

  1. 在调用第一个response.end时,HTTP连接是否立即释放? (奖金点:我怎么可以自己检查这个?)
  2. 我可以使用这个在myOtherFunc中执行任意复杂/昂贵的计算,甚至是同步的计算吗? 由于连接已经释放,客户端不再等待? (或者有什么理由不?
  3. 这可以作为一个范例在调用时执行“背景”任务,“myOtherFunc”是一个任意的后台任务 – 因为它现在基本上在“后台”运行了吗?

我没有testing过,但是:

  1. 鉴于节点的asynchronous性质,有可能在第二个response.end被调用之前stream不会被释放,但是我怀疑你可以依靠这个…在某些时候,连接必须closures并且试图发送新的数据将“充其量”默默地失败。
  2. 连接被释放,客户端将不会等待…至less这个请求,但是昂贵的同步计算会占用你的应用程序的其余部分,完全停止。 任何后续的请求将不得不等待你的工作完成,如果你在接下来的几个滴答声中没有得到response ,赔率将会消失。
  3. 了解更多关于节点单线程的信息。 节点不是一次做一堆事情,而是在等待的时候不阻塞。 没有“背景”,除非你明确地产生自己的线程来做一些事情。

编辑:我正在工作的假设, responsestream是明确closures, end呼吁,而不是坐在那里等待垃圾收集。 我的假设是,它只是asynchronous完成,而不是等待完成继续,如果你在事件循环的下一个对话框内到达那里,它仍然可以被分配。

再次编辑:你的无畏回答者已经通过节点源不知疲倦地search,确认两个调用end确实不起作用,第二个调用应该由OutgoingMessage.finished属性短路(见行499-501和541)

调用response.end不会停止正在执行的任何asynchronous代码。 如果您尝试结束或修改已经结束的响应,您可能会看到奇怪的行为。 所以,基本上都是。 但是我承认,我不是一个在后台如何处理HTTP连接方面的专家。