Node.js之async_hooks

Node.js的async_hooks模块提供了API来跟踪异步资源的生命周期,每个异步操作都有唯一的asyncId,可以通过创建Hook来监听init、before、after、destroy等生命周期。Promise的执行也可以被追踪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

async_hooks

异步钩子;
提供了一组API用来跟踪Nodejs的异步资源(asynchronous resources)的生命周期;

特性:

  1. 每个函数都会提供一个上下文,为async scope(node为每个函数都提供了一个async scope);
  2. 每个async scope都有一个asyncId标志,最外层的asyncId是1,每个异步资源在创建时asyncId是全量递增的;
  3. 同步函数不会改变其调用者的asyncId;
  4. 同一个函数,不同时刻进行异步调用,会分配不同的asyncId;
  5. triggerAsyncId当前函数调用者的asyncId;
  6. executionAsyncId当前函数的asyncId;
const fs = require('fs')
const async_hooks = require('async_hooks')

const eid = async_hooks.executionAsyncId()
const tid = async_hooks.triggerAsyncId()
console.log(`executionAsyncId: ${eid}, triggerAsyncId: ${tid}`)

const asyncHooks = async_hooks.createHook({
    // fs.writeSync向控制台打印消息,不可用console.log,因为它是一个异步调用,再次使用会触发hook事件,造成无限循环。
    init(asyncId, type, triggerAsyncId, resource) {
        fs.writeSync(1, `init start: asyncId-${asyncId}, type-${type}, triggerAsyncId-${triggerAsyncId}\n `)
    },
    before(asyncId) {
        fs.writeSync(1, `before: asyncId-${asyncId}\n `)
    },
    after(asyncId) {
        fs.writeSync(1, `after: asyncId-${asyncId}\n `)
    },
    destroy(asyncId) {
        fs.writeSync(1, `destroy: asyncId-${asyncId}\n `)
    }
})

// 启动跟踪
asyncHooks.enable()

// asyncHooks.disable()

执行结果:
在这里插入图片描述

  • async_hooks.createHook(callbacks)
    创建一个hook,初始化hook的声明周期的工厂方法。
    用来跟踪应用中的异步资源,当资源在被初始化,回调之前,回调之后,销毁后,自动触发init,before,after,destory。

  • asyncHooks.enable()
    启用跟踪

  • asyncHooks.disable()
    关闭跟踪

  • init(asyncId, type, triggerAsyncId, resource)
    asyncId:代表当前异步资源的ID,每个异步资源都会生成一个唯一性标志;
    type:表示该资源的类型;
    triggerAsyncId:调用者的asyncId,即触发当前异步资源被创建的对应的async scope的asyncid;
    resource:被初始化的异步资源包含的一些信息;

  • before(asyncId)
    在asyncId对应的异步资源操作完成后,准备执行回调函数前被调用,由回调的次数决定执行的次数。

  • after(asyncId)
    异步资源操作完成后立即被调用。

  • destroy(asyncId)
    asyncid被销毁时调用

  • promiseResolve(asyncId)

  • async_hooks.executionAsyncId()
    当前异步资源的ID

  • async_hooks.triggerAsyncId()
    调用者的ID

  • Promise执行跟踪
    PromiseResolve(asyncId)

Promise.resolve(1729).then(() => {
    console.log(`Promise resolve: executionAsyncId: ${async_hooks.executionAsyncId()}, triggerAsyncId: ${async_hooks.triggerAsyncId()}`)
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值