根据评论/答案查看问题底部的更新:这个问题实际上是关于不执行回调的隐藏线程的可能性。
我有一个关于涉及 Node Request module 的潜在神秘场景的问题其中:
完整的 HTTP 请求在网络上构建并执行(需要多少毫秒甚至几秒)
...在在本地计算机上运行时执行单个函数之前(通常以纳秒为单位?) - 有关详细信息,请参阅下文
我发布此内容主要是为了健全性检查,只是为了确保我没有误解有关 Node/JS/Request 模块代码的内容。
来自examples in the Request module (请参阅该部分中的第二个示例)是这样的:
// Copied-and-pasted from the second example in the
// Node Request library documentation, here:
// https://www.npmjs.com/package/request#examples
// ... My ARCANE SCENARIO is injected in the middle
var request = require('request')
request(
{ method: 'GET'
, uri: 'http://www.google.com'
, gzip: true
}
, function (error, response, body) {
// body is the decompressed response body
console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))
console.log('the decoded data is: ' + body)
}
)
// **************************************************** //
// Is the following scenario possible?
//
// <-- HANG HANG HANG HANG HANG HANG HANG HANG HANG -->
//
// Let us pretend that the current thread HANGS here,
// but that the request had time to be sent,
// and the response is pending being received by the thread
//
// <-- HANG HANG HANG HANG HANG HANG HANG HANG HANG -->
// **************************************************** //
.on('data', function(data) {
// decompressed data as it is received
console.log('decoded chunk: ' + data)
})
.on('response', function(response) {
// unmodified http.IncomingMessage object
response.on('data', function(data) {
// compressed data as it is received
console.log('received ' + data.length + ' bytes of compressed data')
})
})
我已经在代码片段中指出了我的神秘场景。
假设 Node 进程在指示的点挂起,但 Node 内部(在隐藏线程中,对 Javascript 不可见,因此不调用任何回调)能够构造请求并通过网络发送;假设挂起一直持续到收到响应(例如,分成两个 block )并等待 Node 处理。 (这种情况确实很神秘,我什至不确定理论上是否可能。)
然后假设挂起结束,上面的 Node 线程被唤醒。此外,假设(以某种方式)Node 能够一直处理响应,直到执行上面代码中的回调函数(但又没有越过原始代码路径中代码中的“挂起”点) ,如果这在理论上是可能的话)。
上述神秘场景理论上可能吗?如果是这样,在对象上安排 'data'
事件之前,数据包是否不会通过网络接收并组合起来,准备传递给回调函数?在这种情况下,如果可能的话,我想 'data'
事件将会被错过。
再次,我明白这是一个神秘的场景 - 考虑到所涉及的内部机制和编码,它甚至在理论上都是不可能的。
这就是我的问题 - 上述神秘场景及其极不可能的竞争条件在理论上是否可能?
我问这个问题只是为了确保我没有遗漏一些关键点。谢谢。
更新:根据评论和回答:我现在已经澄清了我的问题。 “神秘场景”需要有一个隐藏线程(因此无法执行任何用户代码,包括回调)来构造请求,通过网络发送请求,并接收响应 - 没有任何回调可以触发,包括'data'
回调 - 在 'response'
回调准备好被调用时停止,等待(单个)可见 JS 线程唤醒.
最佳答案
不,这不可能发生。
是的,确实有“隐藏”后台线程为异步方法执行工作,但那些线程不调用回调。 javascript 的所有执行都同步、顺序地发生在同一个线程上。该data
事件回调将始终异步执行,即在当前脚本/函数运行完成之后。
虽然在创建回调并将其附加到事件发射器之前确实可能已经有来自网络的数据包到达,但在最低级别监听数据包的回调始终在发送请求之前创建 - 它是 native “makeRequest”方法,并且可以从一开始就调用。因此,当数据包在当前脚本(仍被构造事件发射器和附加处理程序占用)完成之前到达时,此事件将排队,并且回调只会在事件循环结束后执行。准备好 - 下一个回合。到那时,data
事件回调就已经创建并附加了。
关于javascript - Javascript/Node 中从不执行用户代码 : is it possible, 的隐藏线程,如果是这样,是否会导致竞争条件的神秘可能性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30906228/