При изучении node.js asynclocalstorage я столкнулся с интересным расхождением. Официальная документация Node.js приводит пример с ожидаемым выводом, но когда я выполняю тот же код, я получаю другую последовательность.
Код: Выделить всё
const http = require('node:http');
const { AsyncLocalStorage } = require('node:async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function logWithId(msg) {
const id = asyncLocalStorage.getStore();
console.log(`${id !== undefined ? id : '-'}:`, msg);
}
let idSeq = 0;
http.createServer((req, res) => {
asyncLocalStorage.run(idSeq++, () => {
logWithId('start');
// Imagine any chain of async operations here
setImmediate(() => {
logWithId('finish');
res.end();
});
});
}).listen(8081);
http.get('http://localhost:8081');
http.get('http://localhost:8081');
< /code>
Согласно документации, ожидаемый вывод должен быть: < /p>
0: start
1: start
0: finish
1: finish
< /code>
Однако, когда я запускаю этот точный код, я постоянно получаю: < /p>
0: start
0: finish
1: start
1: finish
< /code>
Вопросы < /h2>
[*] Почему фактический порядок выполнения отличается от того, что описано в официальной документации? /> влияет ли это расхождение, как AsynclocalStorage < /code> следует использовать в реальных приложениях? setimmediate [*] Заменить Setimmediate с помощью SetTimeout
[*] Время задержки для контроля времени информации о запросах
. Версия: v20.18.3/v22.12.0
[*] Операционная система: macos/ubuntu
Я был бы признателен за любые идеи, которые объясняют эту поведенческую разницу и помогают мне понять базовые механики.
Подробнее здесь: https://stackoverflow.com/questions/795 ... ffers-from
Мобильная версия