【问题标题】:NodeJS event equivalent of thread local variables?NodeJS事件等效于线程局部变量?
【发布时间】:2020-07-10 08:15:15
【问题描述】:

我正在尝试设计一个框架,但我对 NodeJS 及其基于事件的编程实现并不陌生。在其他环境中,我会使用线程局部变量来做我想做的事情,NodeJS 中是否有等效的东西?

显然在 NodeJS 中你很少使用线程,而是使用事件。我正在寻找的是一个全局变量,一旦设置了它,它将继续具有该值,因为回调是从设置的原始变量调用的,而不是从其他变量调用的。这有意义吗?

我正在尝试做的是设计一个库/框架,所以,我目前没有任何代码,但是例如,想象有这样一个函数:

    async function doSomething() {
       await connect()
       await doSomethingElse()
       await doSomethingElseAgain()
    }

我希望connect() 将连接存储在一个线程本地 变量中,以便doSomethingElse()doSomethingElseAgain() 使用相同的连接,即使有两个线程 doSomething() 的 em> 正在运行(但我知道它们不是线程,而是 doSomething() 的两次执行中一个接一个运行的事件)。

我不想将任何参数从connect() 传递给其他函数。我已经知道该怎么做,但是破坏了我正在尝试的设计。

【问题讨论】:

  • 您通常会在闭包中使用局部变量,这些变量只能在该闭包内访问(事件处理程序所在的位置)。有关如何执行此操作的更多具体信息,请显示您的实际 nodejs 代码。
  • @jfriend00:我知道闭包是如何工作的,但我不希望我的库/框架的用户传递局部变量,这就是我要避免的。目前没有代码,但如果有帮助,我可以模拟一些东西。
  • @jfriend00:在那里,我添加了一些代码。
  • 由于 Javascript 的事件驱动、异步特性以及它如何在一个线程中运行所有代码(WorkerThreads 除外,它完全是一个不同的对话),线程局部变量的概念并不真正在这里申请。无论如何,您的所有代码都在同一个线程中运行,因此即使有线程本地人,它们也无济于事。这就是为什么你使用闭包和局部变量,或者使函数成为公共对象的方法,并将公共数据存储在该对象中或传递上下文对象。
  • @jfriend00:这不是唯一的方法。有 cls-hooked 和 async 钩子,它们不依赖于局部变量。

标签: node.js


【解决方案1】:

我不是 100% 确定,因为我仍在探索,但我相信我已经找到了解决方案,它就是名为 cls-hooked 的包。如果我发现更多的一种或另一种方式,我会发布更多。

【讨论】:

  • 请记住,这是一个实验性功能,并不能保证当前的设计或 API 永远保持不变。
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多