Skip to content

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

Released under the MIT License.