我正在尝试使用Almond.js和Require.js优化器来创建一个可以在没有Require.js的情况下使用的独立文件。我已经能够成功编译该文件,所有代码都运行,但是有一个问题:代码执行顺序错误。
假设我的主文件(传递给优化器的include=
选项中的文件)具有以下内容:
console.log('outside');
require(['someFile'], function(someModule) {
console.log('inside');
window.foo = someModule.rightValue;
});
然后在我的HTML中我有:
<script src="myCompiledFile.js"></script>
<script>
console.log('out in the HTML');
</script>
由于我正在使用almond.js和一个已编译的文件(因此没有文件加载)我希望得到输出:
outside
inside
out in the HTML
然而,事实证明仍有一些异步性,因为我实际看到的是:
outside
out in the HTML
inside
如果我尝试从HTML中检查window.foo
,那就不存在了。
所以,我的问题是,我怎样才能使代码更像普通/同步JS文件,在将内容传递到下一个script
块之前先运行所有代码?我无法确切地告诉我的用户“将所有代码包装在window.setTimeout中”。
答案 0 :(得分:2)
默认情况下,Almond复制RequireJS'require
调用的计时语义。由于require
在RequireJS中是异步的,因此它在Almond中也是异步的。这可以在source中轻松观察到:Almond使用setTimeout
来安排模块的执行,即使它可以立即执行它。这是有道理的,因为在通用案例中,开发人员不希望他们精心设计的代码异步工作会因为他们使用Almond而突然变得同步。它在每个项目中无关紧要,但在一个项目中,UI(例如)应按特定顺序刷新,更改时序语义可能会破坏代码。
两个选项:
作为setTimeout
状态之前的评论,使用require('id')
与Almond一起使用全球。这是因为一旦你的软件包被加载,一切都会被保证加载(因为杏仁不会动态加载)。
还可以使用extra arguments来呼叫require
。如果第四个参数为true,则调用将是同步的:
require(['someFile'], function(someModule) {
console.log('inside');
window.foo = someModule.rightValue;
}, undefined, true);
这可以通过阅读杏仁的代码来确定。我没有在forceSync
上找到的文档(这是有问题的参数的名称),但有些错误报告mention it,我没有看到任何评论,它意味着它是一个私有功能。