Continuation-local-storage теряет значения после вызова await/async?
Я пытаюсь использовать continue-local-storage для сохранения некоторого значения контекста, пока не будут выполнены несколько ( 1-2) асинхронных задач. Ниже мой код и его пример вывода,
var request = require('request');
var cls = require('continuation-local-storage');
function main() {
var writer = cls.createNamespace('test');
writer.run(async function () {
writer.set('key', 'test_value');
console.log('cls value: ' + cls.getNamespace('test').get('key'));
let r1 = await apiCall();
console.log('cls value: ' + cls.getNamespace('test').get('key'));
let r2 = await apiCall();
console.log('cls value: ' + cls.getNamespace('test').get('key'));
let r3 = await apiCall();
console.log('cls value: ' + cls.getNamespace('test').get('key'));
});
}
async function apiCall() {
return await request.get('https://localhost:8080/');
}
main();
Результат вышеупомянутого app.js,
cls value: test_value
cls value: undefined
cls value: undefined
cls value: undefined
Итак, после первого звонка в async
функция с использованием await
, моя ценность потерялась, она не определена. Как мне использоватьcontinuation-local-storage
для нескольких await
на async
вызовы функций без потери значения, установленного на continuation-local-storage
?
Обновить
Ознакомьтесь с этой проблемой Github https://github.com/othiym23/node-continuation-local-storage/issues/133, он рекомендует использовать cls-hooked.
2 ответа
Обновить
Ознакомьтесь с этой проблемой Github https://github.com/othiym23/node-continuation-local-storage/issues/133, он рекомендует использовать cls-hooked.
Обновление для ответа на апрель 2021 г.
Просто чтобы добавить сюда, если вы используете узел 12.17.0 или 13.10.0 и выше, лучше использовать нативный, который намного быстрее, чем cls-hooked.
Я также написал альтернативу cls-hooked, которая предоставляет тем, кто использует узел версии 8.12.0 и выше, согласованный API для
AsyncLocalStorage
. Моя реализация немного отличается от cls-hooked и немного быстрее, а также исправляет некоторые текущие ошибки.
Небольшой микро-бенчмарк здесь https://github.com/Darkripper214/ALS-CLS-Benchmark
Вы можете посмотреть здесь. https://github.com/Darkripper214/ALS-Контекст