为什么 setTimeout 无法访问外部特定变量?
Why setTimeout not able to access outside specific variable?
我发现了 setTimeout
的一个奇怪行为。我不知道为什么它能够 select 从 setTimeout
之前声明的那些变量值中正确地 select 而不是特定的变量值。
this.RegisterForUpdateContents = function (intervalTime, FormControlGuid)
{
var layoutInfo = sessionStorage.getItem('LayoutInfo');
var panelName = "Panel_" + FormControlGuid;
var timeOut = parseInt(intervalTime) * 1000;
var self = this;
var timeoutHandle = setTimeout(function ()
{
var dashboardViewer = "dashboardViewer_" + FormControlGuid;
console.log('Just sending callback for Update and LayoutInfo is : ' + layoutInfo);
var CallbackInfo = { 'selectedClientId': ClientId_HeaderSection.GetValue(), 'PanelName': panelName, 'Width': dockPanel.width, 'Height': dockPanel.height, 'dashboardViewer': dashboardViewer, 'UpdateTime': intervalTime, 'Layout': layoutInfo };
}, timeOut);
sessionStorage.setItem((panelName + "|" + "Timeout"), timeoutHandle);
}
我可以访问 panelName
内容,但我不知道 layoutInfo
发生了什么。 layoutInfo
始终为空,如 ""
。但是如果我从 sessionStorage.getItem('LayoutInfo')
访问 setTimeout
内部,它是可以访问的。
有人知道为什么吗?
编辑
$.each(keys, function (index, singlePanel)
{
sessionStorage.setItem(singlePanel, JSON.stringify(panelRenderingInfo));
if (UpdateTime)
selfInstance.RegisterForUpdateContents(UpdateTime, FormControlGuid);
});
var LayoutVSClient = { 'CurrentLayout': selectedLayout,'selectedClientValue': ClientId_HeaderSection.GetValue() };
sessionStorage.setItem('LayoutInfo', JSON.stringify(LayoutVSClient));
我刚刚重新创建了您的代码,尽可能接近 JSFiddle。
testTimeout = function (intervalTime, formControlGuid)
{
var layoutInfo = sessionStorage.getItem('LayoutInfo');
var panelName = "Panel_" + formControlGuid;
var timeOut = parseInt(intervalTime) * 1000;
var self = this;
var timeoutHandle = setTimeout(function ()
{
var dashboardViewer = "dashboardViewer_" + formControlGuid;
console.log('Just sending callback for Update and LayoutInfo is : ' + layoutInfo);
var CallbackInfo = { 'selectedClientId': 'client-header-section-value', 'PanelName': panelName, 'Width': dockPanel.width, 'Height': dockPanel.height, 'dashboardViewer': dashboardViewer, 'UpdateTime': intervalTime, 'Layout': layoutInfo };
}, timeOut);
sessionStorage.setItem((panelName + "|" + "Timeout"), timeoutHandle);
}
var dockPanel = { width:50, height:60 };
sessionStorage.setItem('LayoutInfo', 'layoutInfoContent');
testTimeout(2, '325609e6-51bd-4c69-9613-be0b36b7e2a1');
使用这个示例,我无法重现您描述的问题。您是否有一行代码来设置 sessionStorage
?示例:
sessionStorage.setItem('LayoutInfo', 'layoutInfoContent');
===编辑===
@Uston,你能否将上面新编辑的代码更改为以下内容:
var LayoutVSClient = { 'CurrentLayout': selectedLayout,'selectedClientValue': ClientId_HeaderSection.GetValue() };
sessionStorage.setItem('LayoutInfo', JSON.stringify(LayoutVSClient));
$.each(keys, function (index, singlePanel)
{
sessionStorage.setItem(singlePanel, JSON.stringify(panelRenderingInfo));
if (UpdateTime)
selfInstance.RegisterForUpdateContents(UpdateTime, FormControlGuid);
});
我认错了!!
在调用 RegisterForUpdateContents 之前,我必须使用 LayoutInfo 键设置 sessionStorage。
@Ant:谢谢你的观点。
我发现了 setTimeout
的一个奇怪行为。我不知道为什么它能够 select 从 setTimeout
之前声明的那些变量值中正确地 select 而不是特定的变量值。
this.RegisterForUpdateContents = function (intervalTime, FormControlGuid)
{
var layoutInfo = sessionStorage.getItem('LayoutInfo');
var panelName = "Panel_" + FormControlGuid;
var timeOut = parseInt(intervalTime) * 1000;
var self = this;
var timeoutHandle = setTimeout(function ()
{
var dashboardViewer = "dashboardViewer_" + FormControlGuid;
console.log('Just sending callback for Update and LayoutInfo is : ' + layoutInfo);
var CallbackInfo = { 'selectedClientId': ClientId_HeaderSection.GetValue(), 'PanelName': panelName, 'Width': dockPanel.width, 'Height': dockPanel.height, 'dashboardViewer': dashboardViewer, 'UpdateTime': intervalTime, 'Layout': layoutInfo };
}, timeOut);
sessionStorage.setItem((panelName + "|" + "Timeout"), timeoutHandle);
}
我可以访问 panelName
内容,但我不知道 layoutInfo
发生了什么。 layoutInfo
始终为空,如 ""
。但是如果我从 sessionStorage.getItem('LayoutInfo')
访问 setTimeout
内部,它是可以访问的。
有人知道为什么吗?
编辑
$.each(keys, function (index, singlePanel)
{
sessionStorage.setItem(singlePanel, JSON.stringify(panelRenderingInfo));
if (UpdateTime)
selfInstance.RegisterForUpdateContents(UpdateTime, FormControlGuid);
});
var LayoutVSClient = { 'CurrentLayout': selectedLayout,'selectedClientValue': ClientId_HeaderSection.GetValue() };
sessionStorage.setItem('LayoutInfo', JSON.stringify(LayoutVSClient));
我刚刚重新创建了您的代码,尽可能接近 JSFiddle。
testTimeout = function (intervalTime, formControlGuid)
{
var layoutInfo = sessionStorage.getItem('LayoutInfo');
var panelName = "Panel_" + formControlGuid;
var timeOut = parseInt(intervalTime) * 1000;
var self = this;
var timeoutHandle = setTimeout(function ()
{
var dashboardViewer = "dashboardViewer_" + formControlGuid;
console.log('Just sending callback for Update and LayoutInfo is : ' + layoutInfo);
var CallbackInfo = { 'selectedClientId': 'client-header-section-value', 'PanelName': panelName, 'Width': dockPanel.width, 'Height': dockPanel.height, 'dashboardViewer': dashboardViewer, 'UpdateTime': intervalTime, 'Layout': layoutInfo };
}, timeOut);
sessionStorage.setItem((panelName + "|" + "Timeout"), timeoutHandle);
}
var dockPanel = { width:50, height:60 };
sessionStorage.setItem('LayoutInfo', 'layoutInfoContent');
testTimeout(2, '325609e6-51bd-4c69-9613-be0b36b7e2a1');
使用这个示例,我无法重现您描述的问题。您是否有一行代码来设置 sessionStorage
?示例:
sessionStorage.setItem('LayoutInfo', 'layoutInfoContent');
===编辑===
@Uston,你能否将上面新编辑的代码更改为以下内容:
var LayoutVSClient = { 'CurrentLayout': selectedLayout,'selectedClientValue': ClientId_HeaderSection.GetValue() };
sessionStorage.setItem('LayoutInfo', JSON.stringify(LayoutVSClient));
$.each(keys, function (index, singlePanel)
{
sessionStorage.setItem(singlePanel, JSON.stringify(panelRenderingInfo));
if (UpdateTime)
selfInstance.RegisterForUpdateContents(UpdateTime, FormControlGuid);
});
我认错了!!
在调用 RegisterForUpdateContents 之前,我必须使用 LayoutInfo 键设置 sessionStorage。 @Ant:谢谢你的观点。