我正在尝试使用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中”。
发布于 2014-03-05 11:12:45
默认情况下,杏仁复制RequireJS‘require调用的时间语义。因为require在RequireJS中是异步的,所以它在杏仁中也是异步的。在来源中可以很容易地看到这一点:杏仁使用setTimeout来调度模块的执行,尽管它可以立即执行它。这是有意义的,因为在一般情况下,开发人员并不期望他们构建的异步工作代码仅仅因为使用了Almond就会突然变得同步。并不是每个项目都有关系,但是在一个UI (例如)应该按一定顺序刷新的项目中,更改时间语义可能会破坏代码。
有两种选择:
setTimeout声明之前的评论,使用require('id')可以在全球范围内与杏仁一起工作。这是因为一旦加载了包,就可以保证加载了所有内容(因为Almond不动态加载)。这可以通过阅读杏仁的代码来确定。我在forceSync上找不到任何文档(这是所讨论的参数的名称),但是一些bug报告了提出来,我在那里没有看到任何关于它是一个私有功能的评论。
https://stackoverflow.com/questions/22187098
复制相似问题