TLS用于一些普通的单线程程序使用全局变量的地方,但在多线程情况下这样做不合适。
由于JavaScript没有外露螺纹,全局变量是简单回答你的问题,但使用一个是不好的做法。
您应该改为使用闭包:只需将所有异步调用包装到函数中并在其中定义变量即可。
功能和回调封闭内创建封闭之外创建
(function() (
var visibleToAll=0;
functionWithCallback(params, function(err,result) {
visibleToAll++;
// ...
anotherFunctionWithCallback(params, function(err,result) {
visibleToAll++
// ...
});
});
functionReturningPromise(params).then(function(result) {
visibleToAll++;
// ...
}).then(function(result) {
visibleToAll++;
// ...
});
))();
功能
若您需要您的变量是请求范围内没有定义可见里面的功能,你可以创建一个上下文对象,而不是和它传递给函数:
(function c() (
var ctx = { visibleToAll: 0 };
functionWithCallback(params, ctx, function(err,result) {
ctx.visibleToAll++;
// ...
anotherFunctionWithCallback(params, ctx, function(err,result) {
ctx.visibleToAll++
// ...
});
});
functionReturningPromise(params,ctx).then(function(result) {
ctx.visibleToAll++;
// ...
}).then(function(result) {
ctx.visibleToAll++;
// ...
});
))();
使用上面所有的函数方法称为内c()
请参考相同的ctx
对象,但对c()
的不同调用具有各自的上下文。在典型的用例中,c()
将是您的请求处理程序。
结合上下文this
则可以将上下文对象this
通过调用它们通过Function.prototype.call
绑定在调用的函数:
functionWithCallback.call(ctx, ...)
...与Function.prototype.bind
创建新的功能实例:
var boundFunctionWithCallback = functionWithCallback.bind(ctx)
...或使用承诺效用函数,如bluebird's .bind
Promise.bind(ctx, functionReturningPromise(data)).then(...)
任何这些将使CTX提供自己的函数中的this
:
this.visibleToAll ++;
...然而它并没有真正的优势,通过传递上下文 - 你的函数仍然需要知道通过this
传递的上下文,并且你可能会意外地污染全局对象,如果你曾经没有上下文调用函数。
在此问题中添加一个[MCVE]将是一件非常有用的事情。 JS是单线程的,你声明的所有变量在技术上都是线程本地的(或更少)。 – Tomalak
请查看线程局部变量如何在Java,C#甚至Python中工作。这是一个非常成熟的领域,与将普通变量放在堆栈上无关。 https://en.wikipedia.org/wiki/Thread-local_storage – Joppe
我知道线程本地存储是什么。我在说你应该添加一个代码示例来演示你的问题。 – Tomalak