http请求的生命周期

时间:2017-06-08 16:10:53

标签: node.js

在学习节点并通过一些例子,我有一个原型,它在测试中完美运行,但我担心它是偶然的工作'。

代码(严重剥离)归结为以下

function CheckValue(){
  var req=http.request({/*some options*/},
                       function (resp){
                       resp.on('data',
                               function (s){
                         /* process the response */
                       })});
  /* Tweak a few headers here. */
  req.end();
}

现在,如果我正确理解文档 - 请求实际上是在req.end()发送到服务器,并且在收到数据之前不会处理回调。

因此;如果在发出请求和收到响应之间存在重大延迟,那么req对象是否可以被垃圾收集?如果是这样,回调可能不会被调用?或者,从另一个角度来看:节点是否在内部维护对http请求的任何引用,直到它们完成?

(代码是故意以 fire并忘记的方式编写的,req在函数内部作用域而不保存在任何全局范围内。存储该代码是可行的。在数组中请求并在resp.on('end',...)期间删除请求,但我宁愿避免复杂性和开销。)

1 个答案:

答案 0 :(得分:1)

是。请参阅documentation

  

类:http.Agent -   代理负责管理HTTP客户端的连接持久性和重用。它为给定的主机和端口维护一个待处理请求队列,为每个队列连接重新使用单个套接字连接,直到队列为空,此时套接字被销毁或放入池中,以便再次用于请求到同一个主机和端口。它是被销毁还是合并取决于keepAlive选项。

有一个global Agent instance用作所有HTTP客户端请求的默认值。所以底线是,这个Agent实例将处理和存储请求对象的引用,因此req对象不会被垃圾回收。