在 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');
});
具体:
- HTTP 连接是否在调用第一个response.end 后立即释放? (加分点:我如何自己检查?)
- 我可以使用它在 myOtherFunc 中执行任意复杂/昂贵的计算,甚至是同步计算吗?由于连接已被释放,客户端不再等待? (或者有什么理由不这样做吗?)
- 这可以用作在调用时执行“后台”任务的范例吗?“myOtherFunc”是任意后台任务——因为它现在本质上是在“后台”运行?
最佳答案
我没有测试过,但是:
- 鉴于 Node 的异步性质,在调用第二个
response.end
之前流可能不会被释放,但我怀疑你可以依赖这一点......在某些时候连接必须关闭,并且尝试发送新数据“充其量”会默默失败。 - 连接被释放,客户端至少不会等待该请求,但昂贵的同步计算将阻碍应用程序的其余部分,完全停止。任何后续请求都必须等待您的工作完成,如果您在接下来的几个时间点内没有得到响应,那么
响应
很可能会消失。 - 了解有关 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/