Эти два API представляют разные уровни абстракции для работы с асинхронным контекстом в Node.js. Давайте разберем их взаимосвязь.
Предоставляет механизм отслеживания асинхронных операций:
Пример:
const async_hooks = require('node:async_hooks');
const hook = async_hooks.createHook({
init(asyncId, type, triggerAsyncId) {
console.log(`Init: ${type} (${asyncId})`);
}
});
hook.enable();
Предоставляет удобный API для хранения данных в асинхронном контексте:
const { AsyncLocalStorage } = require('node:async_context');
const als = new AsyncLocalStorage();
als.run({ key: 'value' }, () => {
console.log(als.getStore()); // { key: 'value' }
});
AsyncLocalStorage
построен поверх async_hooks
и использует его для:
Отслеживания контекстов:
als.run()
создается новый асинхронный контекстasync_hooks
отслеживает переходы между контекстамиХранения данных:
async_hooks.executionAsyncId()
Очистки ресурсов:
async_hooks
для детектирования завершения асинхронных операций// Упрощенная реализация ALS
class SimpleALS {
constructor() {
this.storage = new Map();
this.hook = async_hooks.createHook({
init: (asyncId, type, triggerAsyncId) => {
if (this.storage.has(triggerAsyncId)) {
this.storage.set(asyncId, this.storage.get(triggerAsyncId));
}
},
destroy: (asyncId) => {
this.storage.delete(asyncId);
}
});
this.hook.enable();
}
}
AsyncLocalStorage
оптимизирован и быстрее чистого async_hooks
Пример интеграции:
const als = new AsyncLocalStorage();
const hook = async_hooks.createHook({
before(asyncId) {
const store = als.getStore();
if (store) {
console.log(`Context before ${asyncId}:`, store);
}
}
});
als.run({ requestId: 42 }, () => {
hook.enable();
setTimeout(() => {
// Сохраняет контекст благодаря ALS и async_hooks
console.log(als.getStore()); // { requestId: 42 }
}, 100);
});
AsyncLocalStorage
— высокоуровневая надстройка над async_hooks
async_hooks
для глубокого контроля и мониторингаAsyncLocalStorage
для повседневной работы с контекстомИспользуйте ALS для большинства задач, а async_hooks — когда нужен максимальный контроль над асинхронными операциями.