Модуль async_hooks
в Node.js претерпел значительные изменения с момента своего появления. Некоторые функции были помечены как deprecated (устаревшие) по следующим причинам:
Почему устарели:
Пример устаревшего кода:
const async_hooks = require('node:async_hooks');
const hook = async_hooks.createHook({
init(asyncId, type, triggerAsyncId) {
// Устаревший подход
asyncResource.emitBefore();
// Логика...
asyncResource.emitAfter();
}
});
Причины устаревания:
Устаревшее использование:
// Устаревший способ
const currentId = async_hooks.executionAsyncId();
Рекомендуемая замена:
const { AsyncLocalStorage } = require('node:async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function logWithId(msg) {
const id = asyncLocalStorage.getStore();
console.log(`${id !== undefined ? id : '-'}:`, msg);
}
asyncLocalStorage.run(123, () => {
logWithId('Hello'); // 123: Hello
});
Современный подход:
const async_hooks = require('node:async_hooks');
const hook = async_hooks.createHook({
init(asyncId, type, triggerAsyncId, resource) {
// Только необходимые события
}
});
Некоторые API async_hooks
могли замедлять приложение на 20-30%
Реализация корректной работы всех хуков требовала значительных усилий
Некоторые сценарии использования приводили к утечкам памяти или неожиданным ошибкам
emitBefore/emitAfter
на AsyncLocalStorage
asyncLocalStorage.getStore()
вместо executionAsyncId()
До:
const asyncResource = new async_hooks.AsyncResource('my-type');
asyncResource.emitBefore();
try {
// Логика
} finally {
asyncResource.emitAfter();
}
После:
const { AsyncLocalStorage } = require('node:async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
asyncLocalStorage.run(new AsyncResource('my-type'), () => {
// Логика
});
AsyncLocalStorage
для большинства сценариев Node.js постепенно отказывается от проблемных API в async_hooks
в пользу более стабильных и производительных альтернатив. Основные изменения коснулись механизмов отслеживания контекста выполнения, которые были заменены на AsyncLocalStorage
. При работе с асинхронными контекстами следует использовать современные API, которые обеспечивают лучшую производительность и предсказуемость поведения.