2013-07-03 29 views
1

我的公司正在从经典的Dojo语法转向AMD。我们有几种情况需要同步动态加载模块。Dojo需要单参数同步吗?

在dojo中的要求似乎并没有正式支持同步加载(至少它没有记录在任何地方),但它似乎工作,如果你没有传递一个函数作为第二个参数(至少在1.7.2 )。

require(["path/to/my/Module"]); 

我在Fiddler中添加了额外的延迟,它在移到下一行之前肯定会加载。

有谁知道这是否安全依靠?如果它只是从2.0版本中退出的经典风格的宿醉,我并不是特别想要抛弃代码库。

回答

1

即使使用commonJs风格要求,AMD也不支持同步加载。如果模块已经加载,require函数将只能同步加载。请参阅:

如果您已经加载了模块异步则可以使用CommonJS的风格要求,如:

var lang = require("dojo/_base/lang"); 

但是,如果你还没有加载它,它会抛出一个undefinedModule错误(我已经测试了这在v1.9中)。如果这在v1.7中有效,那么在更高版本的Dojo中已经修复了

不可能暂时放入同步模式或者通过使一个新的配置,以道场,例如:

require({"async":false}); 

异步设置只能在负载时被设置(见:http://dojotoolkit.org/reference-guide/1.9/loader/amd.html#loader-amd-configuration)。因此,您在初始加载时选择异步或同步,然后将其卡在那里。

我会建议重构任何需要同步操作的代码。这通常是可能的,结果可能是更好更快的代码。

+0

从看AMD API我认为这可能是Dojo的一部分的错误。我使用的语法不 要求(串) 或 要求(阵列,功能) 它 要求(阵列) 模块绝对尚未加载但因为我在一个单位调用它测试我预先不需要的地方。它正在同步加载,因为我使用fiddler将呼叫延迟增加了2000ms,并等待它加载。 –

+0

我试图复制这个,但一直没能做到(同时使用v1.9和v.1.7.2)。我已经使用了数组格式(没有回调),但它仍然是异步加载的。也许你正在使用不同的设置?我有{cacheBust:true,async:true} - 尝试过使用本地Dojo并使用Google CDN。即使它同步工作,我也会认为这将在未来和随机时间切换到异步 - 即。它可能在装载机上使用了一个未知的缺陷。我不是Dojo加载器的专家,所以我不能肯定地说这是否是正确的行为。 –