async_hooks.createHook(callbacks)
参数
callbacks
<Object> 钩子回调注册init
<Function> init(asyncId, type, triggerAsyncId, resource).before
<Function>before
回调.after
<Function>after
回调.destroy
<Function>destroy
回调.promiseResolve
<Function> promiseResolve(asyncId).
- 返回: <AsyncHook> 用于禁用和启用钩子的实例
注册要为每个异步操作的不同生命周期事件调用的函数。
回调init()
/before()
/after()
/destroy()
在资源的生命周期内为相应的异步事件调用。
所有回调都是可选的。例如,如果只需要跟踪资源清理,则只需要传递destroy
回调。可以传递给callbacks
的所有函数的细节在Hook Callbacks 部分。
import { createHook } from 'node:async_hooks'; const asyncHook = createHook({ init(asyncId, type, triggerAsyncId, resource) { }, destroy(asyncId) { } });
const async_hooks = require('node:async_hooks'); const asyncHook = async_hooks.createHook({ init(asyncId, type, triggerAsyncId, resource) { }, destroy(asyncId) { } });
回调将通过原型链继承:
class MyAsyncCallbacks {
init(asyncId, type, triggerAsyncId, resource) { }
destroy(asyncId) {}
}
class MyAddedCallbacks extends MyAsyncCallbacks {
before(asyncId) { }
after(asyncId) { }
}
const asyncHook = async_hooks.createHook(new MyAddedCallbacks());
因为 Promise 是通过异步钩子机制跟踪其生命周期的异步资源,所以 init()
、 before()
、 after()
和 destroy()
回调不能是返回 Promise 的异步函数。
错误处理#
如果任何AsyncHook
回调抛出,应用程序将打印堆栈跟踪并退出。退出路径确实遵循未捕获异常的路径,但所有'uncaughtException'
侦听器都被删除,从而强制进程退出。除非应用程序使用 --abort-on-uncaught-exception
运行,否则仍将调用 'exit'
回调,在这种情况下,将打印堆栈跟踪并且应用程序退出,留下一个核心文件。
这种错误处理行为的原因是这些回调在对象生命周期中的潜在不稳定点运行,例如在类构造和销毁期间。正因为如此,有必要迅速关闭该过程,以防止将来意外中止。如果执行全面分析以确保异常可以遵循正常的控制流程而不会产生意外的副作用,这可能会在未来发生变化。
打印在AsyncHook
回调#
因为打印到控制台是异步操作,所以console.log()
将导致调用AsyncHook
回调。在 AsyncHook
回调函数中使用 console.log()
或类似的异步操作将导致无限递归。调试时一个简单的解决方案是使用同步日志记录操作,例如 fs.writeFileSync(file, msg, flag)
。这将打印到文件并且不会递归调用AsyncHook
,因为它是同步的。
import { writeFileSync } from 'node:fs'; import { format } from 'node:util'; function debug(...args) { // Use a function like this one when debugging inside an AsyncHook callback writeFileSync('log.out', `${format(...args)}\n`, { flag: 'a' }); }
const fs = require('node:fs'); const util = require('node:util'); function debug(...args) { // Use a function like this one when debugging inside an AsyncHook callback fs.writeFileSync('log.out', `${util.format(...args)}\n`, { flag: 'a' }); }
如果日志记录需要异步操作,则可以使用AsyncHook
本身提供的信息来跟踪导致异步操作的原因。当日志记录本身导致调用AsyncHook
回调时,应该跳过日志记录。通过这样做,否则无限递归被打破。
相关用法
- Node.js AsyncHook async_hooks.executionAsyncId()用法及代码示例
- Node.js AsyncHook async_hooks.executionAsyncResource()用法及代码示例
- Node.js AsyncHook async_hooks.triggerAsyncId()用法及代码示例
- Node.js async.queue()用法及代码示例
- Node.js assert.notEqual(actual, expected[, message])用法及代码示例
- Node.js assert.notDeepStrictEqual(actual, expected[, message])用法及代码示例
- Node.js assert.fail(actual, expected[, message[, operator[, stackStartFn]]])用法及代码示例
- Node.js assert.deepStrictEqual()用法及代码示例
- Node.js assert.deepEqual(actual, expected[, message])用法及代码示例
- Node.js assert.throws(fn[, error][, message])用法及代码示例
- Node.js assert.equal()用法及代码示例
- Node.js assert.ifError()用法及代码示例
- Node.js assert.throws()用法及代码示例
- Node.js assert.ok()用法及代码示例
- Node.js assert.strictEqual()用法及代码示例
- Node.js assert.fail()用法及代码示例
- Node.js assert.strictEqual(actual, expected[, message])用法及代码示例
- Node.js assert.doesNotThrow(fn[, error][, message])用法及代码示例
- Node.js assert.notStrictEqual(actual, expected[, message])用法及代码示例
- Node.js assert.deepStrictEqual(actual, expected[, message])用法及代码示例
- Node.js assert.match()用法及代码示例
- Node.js assert.notDeepStrictEqual()用法及代码示例
- Node.js assert.doesNotThrow()用法及代码示例
- Node.js assert.rejects()用法及代码示例
- Node.js assert.doesNotReject(asyncFn[, error][, message])用法及代码示例
注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 async_hooks.createHook(callbacks)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。