我发现了setTimeout
的奇怪行为。我不知道为什么它能够从setTimeout
之前声明的那些中正确选择一些变量值,而不是特定值。
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
始终为空""
。但是如果我从setTimeout
访问sessionStorage.getItem('LayoutInfo')
内部,则可以访问。
有人知道为什么吗?
修改
$.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));
答案 0 :(得分:3)
我刚刚在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');
<强> === EDIT === 强>
@ 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);
});
答案 1 :(得分:0)
我认出了我的错误!!
在调用RegisterForUpdateContents之前,我必须使用LayoutInfo键设置sessionStorage。 @Ant:谢谢你的观点。