首页 > 解决方案 > Deno 有办法跟踪异步上下文吗?

问题描述

广义地说,在 NodeJS 中,每当代码运行时,程序都会创建“异步上下文”,通过事件循环或微任务队列创建稍后运行的回调。网络请求、setTimeout回调、Promise 等。

在 NodeJs 的现代版本中,您拥有(仍处于试验阶段)async_hooks模块来跟踪这些异步资源的生命周期。

以前的 NodeJS 版本现在已弃用-polyfill 包process.addAsyncListener保持活动状态。async-listener

Deno 是否有任何内置或第三方功能允许用户态代码跟踪这些异步上下文的创建?或者 Deno 的工作原理是否使这个概念变得无关紧要?

标签: javascriptdenoasync-hooks

解决方案


我不认为这种功能目前或通过 3rd 方模块是公开可用的。

简要研究了async_hooks提供的功能(可能会遗漏一些重要的东西,请纠正我),看起来init并且promiseResolve更像是 Deno 中有趣的功能(Deno 在其 API 中几乎不使用回调)。

Deno 进行特权操作的方式是向 Rust 端发送序列化的文本消息(主要是 JSON)和零拷贝缓冲区,并在 Rust 端调用带有响应消息的回调时从 Rust 端接收消息。如果我们可以通过向一些核心消息通道方法添加一个小的包装监听器来拦截其中的一些,那将会很有趣,例如Deno.core.dispatchByName(几乎所有 Deno 特权操作,异步或同步都使用这个监听器。还有很多有趣的其他上可用的东西Deno.core,请参阅core/core.js源代码。handleAsyncMsgFromRust尽管没有公开从 Rust 接收异步消息的方式)。

不幸Deno.core的是,目前被冻结(实际上我是负责此更改的人)以避免覆盖(这可能会导致升级时的硬崩溃,因为Deno.core主机关键但易失的内部 API)。可能您可以在 Deno 存储库中打开一个问题,询问其他人是否愿意实现某些接口以允许用户将消息捕获回调注入概念sendrecv方法。(我目前无法投稿)


推荐阅读