AsyncLocalStorage
node:async_hooks
https://nodejs.org/api/async_context.html#class-asynclocalstorage
requestごとに、任意の場所から非同期にアクセスできるストレージ
メモリ安全
非同期処理に対するDIみってことねmrsekut.icon
上位概念でcontextをinjectionする
React Contextと同じ構造
providerでscopeを区切って、そのscope内では、propsにアクセスできる
props drillingを回避できる
特定のdom treeに対してscopeを切っている
同様に、runでscopeを区切って、そのscope内では、contextにアクセスできる
getStoreを使ってアクセス
contextを明示的に渡していくのを回避できる
特定の非同期操作に対してscopeを切っている
React Contextは物理的なtreeに対するscopeだが、AsyncLocalStorageは非同期操作という時間的なものに対するscopeを作っている
型目線で言えば、React Contextと同様の問題を抱えているmrsekut.icon
サンプル
code:ts
const { AsyncLocalStorage } = require('async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
main();
async function main() {
// contextとして{user: 'Taro'}をinjecction
asyncLocalStorage.run({ user: 'Taro' }, async () => {
log("非同期操作を開始します");
await fetchData();
log("非同期操作が完了しました");
});
}
async function fetchData() {
// 仮の非同期操作
return new Promise((resolve) => {
setTimeout(() => {
log("データを取得しました");
resolve("data");
}, 1000);
});
}
function log(message) {
// contextを取得できる
const context = asyncLocalStorage.getStore();
console.log([User: ${context.user}] ${message});
}
log()が特定のcontextで使われることを前提としている
log()に明示的にcontextを引数で渡さずにアクセスできている
同期的な操作の間ではcontextは維持されない
非同期操作が完了すると、関連するcontextも破棄される
関連
AsyncHooks
/miyamonz/AsyncLocalStorage
https://zenn.dev/qnighy/articles/772f632af595aa#asynclocalstorage