我正在尝试使用continuation-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
上设置的值?
答案 0 :(得分:1)
更新
请查看此Github问题https://github.com/othiym23/node-continuation-local-storage/issues/133,建议使用cls-hooked。
答案 1 :(得分:0)
更新到 2021 年 4 月的回答
在这里补充一下,如果您使用的是节点 12.17.0 或 13.10.0 及更高版本,最好使用比 cls-hooked 快得多的原生 AsyncLocalStorage
。
我还编写了 cls-hooked 的替代方案,它为使用 node v8.12.0 及更高版本的用户提供了一致的 API 到 AsyncLocalStorage
。我的实现与 cls-hooked 略有不同,速度略快,并且还修复了当前的一些错误。
这里有一个小的微基准 https://github.com/Darkripper214/ALS-CLS-Benchmark