问题标签 [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.

0 投票
1 回答
390 浏览

node.js - 是否有任何使用 async_hooks 检索异步堆栈跟踪的 npm 模块?

节点 8 中有一个名为“async_hook”的新 API,我相信它应该使模块作者能够打印异步堆栈跟踪。我正在寻找类似于 chrome dev-tools 异步堆栈跟踪实现但在开发/调试期间从控制台使用的东西。

我知道这会带来性能开销——但这对我来说很好。

有人知道正在开发的任何模块吗?

0 投票
0 回答
25 浏览

node.js - 如何在事件循环阻塞时不允许连接到 Node.js HTTP 服务器或 TCP 堆栈?

鉴于我知道 Node.js 事件循环在特定操作或通过时阻塞async_hooks,我怎么能告诉 Node 和 TCP 堆栈在阻塞时间内暂时不接受连接,所以 LoadBalancers 不会尝试到达服务器?

0 投票
2 回答
2131 浏览

node.js - 使用 async_hooks 跟踪上下文

我正在尝试使用节点 async_hooks 通过异步堆栈跟踪上下文。它适用于大多数情况,但是我发现这个用例我想不出如何解决:

服务.js:

服务规范.js

这个测试用例会失败,因为调用时创建的nextPromise 的 triggerAsyncId 是 Promise.resolve() 调用的 executionAsyncId。它是在当前异步堆栈之外创建的,是一个单独的上下文。我看不出有任何方法可以将next函数异步上下文与创建它的上下文结合起来。

https://github.com/domarmstrong/async_hook_then_example

0 投票
1 回答
328 浏览

node.js - Node.js 中的 async await 和 async_hooks 有什么区别

async_hooks在 Node v8 中作为实验性引入。因为名称类似于 ES2017 async,所以看起来它们可能在某种程度上相关。他们是吗?如果是这样,以什么方式(互补或竞争)?

0 投票
1 回答
1344 浏览

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 文件

0 投票
1 回答
9000 浏览

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 内置模块,所以我们只需要在顶部安装。

0 投票
1 回答
535 浏览

node.js - 节点 async_hooks 销毁生命周期事件不会为所有资源调用

async_hooks为了跨异步事件跟踪状态,我一直在探索API。我发现destroy并不总是为每个相应的init回调调用回调。

这是一个简单的复制:

以上记录了发出简单 HTTP 请求时的所有init和回调。destroy

这是输出:

我已经对上面的日志进行了注释,以便为每个init没有相应destroy回调的回调添加一个星号 (*)。正如您所看到的TCPWRAPTLSWRAP, , DNSCHANNEL,HTTPPARSER回调类型似乎是有问题的类型。

我担心这种不对称会导致使用这种方法进行“连续本地存储”的各种节点模块中的内存泄漏,例如https://github.com/Jeff-Lewis/cls-hooked

0 投票
0 回答
33 浏览

node.js - 异步挂钩执行 ID 是否可重新分配?

我一直想根据执行 Id 和触发 async_hooks 提供的异步 Id 来维护一些数据。不知何故,我观察到,对于某些触发上下文,假设执行 ID 为 20 的上下文“a”,创建了上下文,另一个上下文“b”(执行 ID 30)从“a”中触发,这个上下文得到被破坏,甚至在完成执行“b”(ok回调)之前。那么,execution-id 20 被重新分配的可能性有多大?

0 投票
2 回答
1389 浏览

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 上进行了测试。

它在所有测试版本上具有相同的行为。

0 投票
1 回答
44 浏览

node.js - async_ids 是否有可能溢出?

在 node.js 中,当一个人执行本质上是异步的事情时,async_id会为它生成一个。此 ID 可通过async_hooksAPI 访问。

由于 id 是整数(64 位),它们是否有可能在某个时候溢出?

似乎重置 id 的唯一原因是出现异常时。 https://github.com/nodejs/node/blob/94454927f697840a25c1ae73ebbcf9a5324b9060/lib/internal/process/execution.js#L129