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

标签 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 连接是否在调用第一个response.end 后立即释放? (加分点:我如何自己检查?)
  2. 我可以使用它在 myOtherFunc 中执行任意复杂/昂贵的计算,甚至是同步计算吗?由于连接已被释放,客户端不再等待? (或者有什么理由不这样做吗?)
  3. 这可以用作在调用时执行“后台”任务的范例吗?“myOtherFunc”是任意后台任务——因为它现在本质上是在“后台”运行?

最佳答案

我没有测试过,但是:

  1. 鉴于 Node 的异步性质,在调用第二个 response.end 之前流可能不会被释放,但我怀疑你可以依赖这一点......在某些时候连接必须关闭,并且尝试发送新数据“充其量”会默默失败。
  2. 连接被释放,客户端至少不会等待该请求,但昂贵的同步计算将阻碍应用程序的其余部分,完全停止。任何后续请求都必须等待您的工作完成,如果您在接下来的几个时间点内没有得到响应,那么响应很可能会消失。
  3. 了解有关 Node 单线程性的更多信息。 Node 的工作原理不是一次做一堆事情,而是在等待时不阻塞。除非您明确生成自己的线程来执行某些操作,否则没有“背景”。

编辑:我正在假设 response 流通过 end 调用显式关闭,而不是仅仅坐在那里等待垃圾收集。我的假设是它只是异步完成,而不是等待完成后再继续,如果您在事件循环的接下来的几个周期内到达那里,它可能仍然被分配。

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

关于javascript - Node.js - 如果我在 I/O 和回调仍在运行时调用 response.end 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22791062/

相关文章:

javascript - 使用 Jest 对 ThreeJS 应用程序进行单元测试

javascript - 简单的 Angular 应用程序不起作用

node.js - 更改 Node.js 监听端口

node.js - Mongo解析错误: Unescaped at-sign in authority section at parseConnectionString

javascript - 使用 node.js 从 C++ 调用 JavaScript

JavaScript。数组元素初始化顺序

javascript - JSON 到 HTML 表 JavaScript 不工作

javascript - 升级到 Webpack 2 后出错。请求的路径在索引 0 处包含未定义的段

javascript - 无法通过 fetch 方法访问 HTMLCollection Item

node.js - Spotify API 搜索返回 301