在学习节点并通过一些例子,我有一个原型,它在测试中完美运行,但我担心它是偶然的工作'。
代码(严重剥离)归结为以下
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',...)
期间删除请求,但我宁愿避免复杂性和开销。)
答案 0 :(得分:1)
是。请参阅documentation:
类:http.Agent - 代理负责管理HTTP客户端的连接持久性和重用。它为给定的主机和端口维护一个待处理请求队列,为每个队列连接重新使用单个套接字连接,直到队列为空,此时套接字被销毁或放入池中,以便再次用于请求到同一个主机和端口。它是被销毁还是合并取决于keepAlive选项。
有一个global Agent instance用作所有HTTP客户端请求的默认值。所以底线是,这个Agent实例将处理和存储请求对象的引用,因此req对象不会被垃圾回收。