Node.js之async_hooks

偶尔善良 提交于 2019-12-19 15:22:24

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()}`)
})

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!