async_hooks
异步钩子;
提供了一组API用来跟踪Nodejs的异步资源(asynchronous resources)的生命周期;
特性:
- 每个函数都会提供一个上下文,为async scope(node为每个函数都提供了一个async scope);
- 每个async scope都有一个asyncId标志,最外层的asyncId是1,每个异步资源在创建时asyncId是全量递增的;
- 同步函数不会改变其调用者的asyncId;
- 同一个函数,不同时刻进行异步调用,会分配不同的asyncId;
- triggerAsyncId当前函数调用者的asyncId;
- 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()}`)
})