- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
请参阅问题底部的更新,基于评论/答案:这个问题实际上是关于不执行回调的隐藏线程的可能性。
我对涉及 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.js 处理。 (这种情况肯定是神秘的,我什至不确定理论上是否可能。)
然后假设挂起结束,上面的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/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!