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