sessionStorage不能立即使用

时间:2014-01-03 14:36:43

标签: javascript html5 requirejs session-storage

在下面的示例中(以及在jsfiddle中,依赖于requirejs),控制台第一次输出theUsernamehttp://nothing&username=null然后如果再次运行它会按照您的预期输出(即,http://nothing&username=theUsername

define('environment', {
    myData: 'http://nothing&username=' + sessionStorage.getItem('username')
});

require(['environment'], function (environment) {
    sessionStorage['username'] = 'theUsername';

    console.log(sessionStorage.getItem('username'));
    console.log(environment.myData);
});

以前的修改

我无法弄清楚如何在jsfiddle中设置所有依赖项,但这是一个简单的版本,展示了azure中的问题。该页面实际上没有做任何事情,并且命中一个死连接字符串,所以你必须通过浏览器开发工具或firebug来查看它。

http://tomdev.azurewebsites.net/www/index.html

好的,希望上次更新...我能够在jsfiddle中显示问题,非常简单,小例子。在Chrome中观看控制台。运行一次,你会看到问题,再次点击运行,你会发现它现在正在运行。

http://jsfiddle.net/JhK5L/1/

2 个答案:

答案 0 :(得分:3)

您正在使用myData中的任何值初始化define()来电中的sessionStorage['username']。因此,第一次调用define()时,该值为null,并且在您sessionStorage['username']函数中初始化require()之前不会设置该值。

不是将myData初始化为字符串,而是将其作为一个getter函数,在调用时检索当前值:

define('environment', {
    myData: function() { return 'http://nothing&username=' + sessionStorage.getItem('username'); }
});

require(['environment'], function(environment) {
    sessionStorage['username'] = 'theUsername';

    $("ul").append('<li>' + sessionStorage.getItem('username') +'</li>');
    $("ul").append('<li>' + environment.myData() +'</li>');
});

答案 1 :(得分:1)

这是在运行代码之前需要环境模块的问题。执行require(['environment'], function () {时,它会在运行任何其他内容之前找到并运行环境模块。这意味着当时会话存储中的任何内容都是输出的内容。然后,它运行该功能,将会话存储设置为它应该是什么。

运行该函数后,您需要使用新值更新myData变量,因为它已经“缓存”旧的值,这是未定义的。