Node.js - 当I / O和回调仍在运行时,如果我调用response.end会发生什么?

时间:2014-04-01 16:03:18

标签: javascript node.js

在Node.js中,如果在我的I / O调用和/或回调仍在执行时调用“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. 在调用第一个响应时,是否立即释放了HTTP连接。 (奖励积分:我如何自己检查?)
  2. 我可以在myOtherFunc中使用它来执行任意复杂/昂贵的计算,甚至是同步计算吗?由于连接已被释放,客户端不再等待? (或者有什么理由不?)
  3. 这可以用作在调用时执行'后台'任务的范例,'myOtherFunc'是一个任意的后台任务 - 因为它基本上现在正在“在后台”运行?

2 个答案:

答案 0 :(得分:1)

调用response.end不会停止任何仍在执行的异步代码。如果您尝试结束或修改已经结束的响应,您可能会看到奇怪的行为。所以,对所有人来说基本上都是不过我承认,我不是节点如何在幕后处理HTTP连接的专家。

答案 1 :(得分:1)

我没有经过测试,但是:

  1. 鉴于节点的异步性质,在调用第二个response.end之前,流可能不会被释放,但我怀疑你可以依赖它......指出连接必须关闭并尝试发送新数据最多"最好"安静地失败。
  2. 连接被释放,客户端不再等待...至少要满足该请求,但昂贵的同步计算将支撑您的应用程序的其余部分,完全停止。任何后续请求都必须等待您的工作完成,如果您未在接下来的几个时间点内完成,则赔率response将会消失。
  3. 详细了解节点的单线程。节点不是一次性做一堆事情,而是在等待时不阻塞。没有"背景"除非你明确产生自己的线程来做某事。
  4. 编辑:我正在假设response流已被end调用显式关闭,而不是只是坐在那里等待垃圾回收。我的假设是它只是异步完成而不是等待完成继续,如果你在事件循环的下一个滴答中到达那里,它仍然可以被分配。

    再次编辑:你的勇敢的回答者通过节点源不知疲倦地搜索并确认,实际上,对end的两次调用确实不起作用,第二次应该被短路by the OutgoingMessage.finished property (see lines 499-501 and 541)