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)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。