问题标签 [async-hooks]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - 是否有任何使用 async_hooks 检索异步堆栈跟踪的 npm 模块?
节点 8 中有一个名为“async_hook”的新 API,我相信它应该使模块作者能够打印异步堆栈跟踪。我正在寻找类似于 chrome dev-tools 异步堆栈跟踪实现但在开发/调试期间从控制台使用的东西。
我知道这会带来性能开销——但这对我来说很好。
有人知道正在开发的任何模块吗?
node.js - 如何在事件循环阻塞时不允许连接到 Node.js HTTP 服务器或 TCP 堆栈?
鉴于我知道 Node.js 事件循环在特定操作或通过时阻塞async_hooks
,我怎么能告诉 Node 和 TCP 堆栈在阻塞时间内暂时不接受连接,所以 LoadBalancers 不会尝试到达服务器?
node.js - 使用 async_hooks 跟踪上下文
我正在尝试使用节点 async_hooks 通过异步堆栈跟踪上下文。它适用于大多数情况,但是我发现这个用例我想不出如何解决:
服务.js:
服务规范.js
这个测试用例会失败,因为调用时创建的next
Promise 的 triggerAsyncId 是 Promise.resolve() 调用的 executionAsyncId。它是在当前异步堆栈之外创建的,是一个单独的上下文。我看不出有任何方法可以将next
函数异步上下文与创建它的上下文结合起来。
node.js - Node.js 中的 async await 和 async_hooks 有什么区别
async_hooks在 Node v8 中作为实验性引入。因为名称类似于 ES2017 async,所以看起来它们可能在某种程度上相关。他们是吗?如果是这样,以什么方式(互补或竞争)?
angular - 在 Angular 应用程序中找不到模块“async_hooks”
试图在我的 Angular 应用程序的帖子组件中删除来自 jsonplaceholder/post 网站的帖子。使用服务从 Json 占位符调用删除 HTTP 时,我收到以下错误。
src/app/components/post/post.component.ts(5,27) 中的错误:错误 TS2307:找不到模块“async_hooks”。src/app/components/post/post.component.ts(55,35):错误 TS2345:“数字”类型的参数不可分配给“数字”类型的参数 | 邮政'。类型“编号”不可分配给类型“邮政”。“数字”类型中缺少属性“id”。
这是发生删除的组件中的 remove post 方法:
}
这是服务中的 removePost 方法:
}
HTML 文件
node.js - 错误:在 NodeJs 中找不到模块“async_hooks”
我正在尝试从官方节点 api 文档运行 Async Hooks 的测试代码,但Error: Cannot find module 'async_hooks'
在控制台中出现错误。我已经包含const async_hooks = require('async_hooks');
在我的脚本顶部。这是我的代码:
我很困惑我需要安装,npm install async_hooks
但我认为它是 nodeJs 内置模块,所以我们只需要在顶部安装。
node.js - 节点 async_hooks 销毁生命周期事件不会为所有资源调用
async_hooks
为了跨异步事件跟踪状态,我一直在探索API。我发现destroy
并不总是为每个相应的init
回调调用回调。
这是一个简单的复制:
以上记录了发出简单 HTTP 请求时的所有init
和回调。destroy
这是输出:
我已经对上面的日志进行了注释,以便为每个init
没有相应destroy
回调的回调添加一个星号 (*)。正如您所看到的TCPWRAP
,TLSWRAP
, , DNSCHANNEL
,HTTPPARSER
回调类型似乎是有问题的类型。
我担心这种不对称会导致使用这种方法进行“连续本地存储”的各种节点模块中的内存泄漏,例如https://github.com/Jeff-Lewis/cls-hooked
node.js - 异步挂钩执行 ID 是否可重新分配?
我一直想根据执行 Id 和触发 async_hooks 提供的异步 Id 来维护一些数据。不知何故,我观察到,对于某些触发上下文,假设执行 ID 为 20 的上下文“a”,创建了上下文,另一个上下文“b”(执行 ID 30)从“a”中触发,这个上下文得到被破坏,甚至在完成执行“b”(ok回调)之前。那么,execution-id 20 被重新分配的可能性有多大?
javascript - 为什么我使用异步钩子 API 会导致 Node.js 异常终止?
我已经破坏了 Node.js!
我正在使用异步钩子 API,我的代码使 Node.js 异常终止。
我的问题是:这段代码是什么让 Node.js 以这种方式终止,我可以在代码中更改什么来解决问题吗?
我的应用程序Data-Forge Notebook需要能够跨 JavaScript 笔记本的评估跟踪异步操作,以了解笔记本的评估何时完成。
因此,我创建了一个名为AsyncTracker的 JavaScript 类,它包装了异步钩子 API,以便我可以为一段代码启用异步跟踪。在代码部分的最后,我可以禁用跟踪并等待当前的异步操作完成。
要初始化跟踪,我这样做:
异步操作记录在 JS 映射中,但它们仅在通过设置trackAsyncOperations
为启用跟踪时添加true
。这是允许在代码部分开始时启用跟踪的变量:
各种异步钩子会导致从地图中删除异步操作:
注意代码行this.asyncOperationsAwaitResolver()
,这是触发我们在代码部分末尾等待的承诺的解决,以等待未决异步操作的完成。
禁用跟踪然后等待挂起的异步操作完成的函数如下所示:
总而言之,这是一个使用跟踪器使 Node.js 无警告中止的最小示例:
请注意,此代码并未全面破坏。当与基于回调或基于承诺的异步操作一起使用时,它似乎工作正常(Node.js 正常终止)。只有当我将await
关键字添加到组合中时它才会失败。因此,例如,如果我用对它await Promise.resolve()
的调用替换setTimeout
它,它会按预期工作。
GitHub上有一个这样的工作示例:
https://github.com/ashleydavis/nodejs-async-tracking-example
运行该代码以使 Node.js 爆炸。要复制克隆 repo,请运行npm install
,然后运行npm start
.
此代码已在 Windows 10 上使用 Node.js 版本 8.9.4、10.15.2 和 12.6.0 进行了测试。
此代码现已在 MacOS v8.11.3、10.15.0 和 12.6.0 上进行了测试。
它在所有测试版本上具有相同的行为。
node.js - async_ids 是否有可能溢出?
在 node.js 中,当一个人执行本质上是异步的事情时,async_id
会为它生成一个。此 ID 可通过async_hooks
API 访问。
由于 id 是整数(64 位),它们是否有可能在某个时候溢出?
似乎重置 id 的唯一原因是出现异常时。 https://github.com/nodejs/node/blob/94454927f697840a25c1ae73ebbcf9a5324b9060/lib/internal/process/execution.js#L129