在下面的示例中(以及在jsfiddle中,依赖于requirejs),控制台第一次输出theUsername
和http://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中观看控制台。运行一次,你会看到问题,再次点击运行,你会发现它现在正在运行。
答案 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变量,因为它已经“缓存”旧的值,这是未定义的。