在等待/异步调用后,continuation-local-storage是否会丢失值?

时间:2019-12-21 06:21:51

标签: javascript async-await continuation-local-storage

我正在尝试使用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上设置的值?

2 个答案:

答案 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

你可以看看这里。 https://github.com/Darkripper214/ALS-Context