2

我正在尝试使用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用于多个函数调用?awaitasynccontinuation-local-storage

更新

查看这个 Github 问题https://github.com/othiym23/node-continuation-local-storage/issues/133它建议使用cls-hooked

4

2 回答 2

1

更新

查看这个 Github 问题https://github.com/othiym23/node-continuation-local-storage/issues/133它建议使用 cls-hooked。

于 2020-03-30T05:04:05.967 回答
0

2021 年 4 月更新回答

在这里补充一下,如果您使用的是节点 12.17.0 或 13.10.0 及更高版本,最好使用AsyncLocalStorage比 cls-hooked 快得多的 native。

我还编写了 cls-hooked 的替代方案,它为使用 node v8.12.0 及更高版本的用户提供了一致的 API 到AsyncLocalStorage. 我的实现与 cls-hooked 略有不同,速度稍快,并且还修复了一些当前的错误。

这里有一个小的微基准 https://github.com/Darkripper214/ALS-CLS-Benchmark

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

于 2021-04-01T17:00:00.097 回答