首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Require.js (almond.js)定时关闭

Require.js (almond.js)定时关闭
EN

Stack Overflow用户
提问于 2014-03-05 02:09:37
回答 1查看 476关注 0票数 0

我正在尝试使用Almond.js和Require.js优化器来创建一个独立的文件,该文件无需Require.js即可使用。我已经成功地编译了这个文件,所有的代码都在运行,但是有一个问题:代码以错误的顺序执行。

假设我的主文件(在传递给优化器的include=选项中的文件)有以下内容:

代码语言:javascript
复制
console.log('outside');
require(['someFile'], function(someModule) {
    console.log('inside');
    window.foo = someModule.rightValue;
});

然后在我的HTML中我有:

代码语言:javascript
复制
<script src="myCompiledFile.js"></script>
<script>
    console.log('out in the HTML');
</script>

由于我使用的是almond.js和已编译的文件(因此没有文件加载),所以我希望得到输出:

代码语言:javascript
复制
outside
inside
out in the HTML

然而,事实证明仍然存在一些异步性,因为我实际看到的是:

代码语言:javascript
复制
outside
out in the HTML
inside

如果我试图从HTML中检查window.foo,它就不在那里了。

因此,我的问题是,如何使代码更像一个正常/同步的JS文件,它在将所有代码传递到下一个script块之前先运行它的所有代码?我不能确切地告诉我的用户“将所有代码包装在一个window.setTimeout中”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-05 11:12:45

默认情况下,杏仁复制RequireJS‘require调用的时间语义。因为require在RequireJS中是异步的,所以它在杏仁中也是异步的。在来源中可以很容易地看到这一点:杏仁使用setTimeout来调度模块的执行,尽管它可以立即执行它。这是有意义的,因为在一般情况下,开发人员并不期望他们构建的异步工作代码仅仅因为使用了Almond就会突然变得同步。并不是每个项目都有关系,但是在一个UI (例如)应该按一定顺序刷新的项目中,更改时间语义可能会破坏代码。

有两种选择:

  • 正如在setTimeout声明之前的评论,使用require('id')可以在全球范围内与杏仁一起工作。这是因为一旦加载了包,就可以保证加载了所有内容(因为Almond不动态加载)。
  • 还有一种使用额外论据调用额外论据的方法。如果第四个参数为真,则调用将是同步的: 需要(‘someModule文件’,函数{ console.log('inside');window.foo = someModule.rightValue;},未定义,真);

这可以通过阅读杏仁的代码来确定。我在forceSync上找不到任何文档(这是所讨论的参数的名称),但是一些bug报告了提出来,我在那里没有看到任何关于它是一个私有功能的评论。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22187098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档