Async hooks
DANGER
目前还不稳定,社区这块出现各种问题
- async_hooks API 能使我们追踪资源(resource)变得更加简单,
- 只需要使用init、before、after、destroy这些回调函数去初始化 async_hooks 接口。
- 相当于前端的生命周期,用来跟踪异步操作
js
const async_hooks = require('node:async_hooks')
// 执行异步ID(executionAsyncId)表示触发执行当前回调的资源ID。
const eid = async_hooks.executionAsyncId()
// 触发器ID(triggerAsyncId)表示创建当前异步资源的那个异步资源的ID。
const tid = async_hooks.triggerAsyncId()
// 创建一个新的 AsyncHook 实例, 所有这些回调都是可选的。
const asyncHook = async_hooks.createHook({
init(asyncId, type, triggerAsyncId, resource) {
// 在对象构造期间被调用。可能存在部分资源没有
// 当此回调运行时已完成构造
// “asyncId” 引用的资源可能不存在。
`${type}(${asyncId}): trigger: ${triggerAsyncId} execution: ${eid}\n`
},
before(asyncId) {
// before() 在调用资源的回调之前调用
console.log(asyncId, 'before')
},
after(asyncId) {
// after() 在资源回调完成后立即调用
console.log(asyncId, 'after')
asyncHook.disable()
},
destroy(asyncId) {
// 在资源被销毁时被调用
console.log(asyncId, 'destroy')
},
// promiseResolve(asyncId) {
// 仅针对 Promise 资源调用promiseResolve()
// console.log(asyncId, 'promiseResolve')
// }
})
// 开启 asyncHook 实例,允许使用 hook 回调
asyncHook.enable()
// 禁用监听新的回调事件
// asyncHook.disable();
setTimeout(() => {
console.log('异步资源', eid, tid)
}, 100);
// 输出示例:
// 2 before
// 异步资源 1 0
// 2 after