【发布时间】: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