【问题标题】:Dojo require with single argument synchronous?Dojo 需要单参数同步吗?
【发布时间】:2013-07-03 09:51:43
【问题描述】:

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

dojo 中的 Require 似乎没有正式支持同步加载(至少在任何地方都没有记录)但是如果你不将 a 函数作为第二个参数传入它似乎可以工作(至少在 1.7.2 中) .

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

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

有谁知道这是否安全可靠?如果它只是将在 2.0 中退役的经典风格的遗留物,我不想在代码库中乱扔垃圾。

【问题讨论】:

    标签: javascript dojo amd


    【解决方案1】:

    AMD 不支持同步加载,即使在使用 commonJs 样式要求时也是如此。仅当模块已经加载时,require 函数才会同步加载。见:

    如果你已经异步加载了模块,那么可以使用 commonJs 风格的 requires,例如:

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

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

    无法通过将新配置传递给 Dojo 来临时将其置于同步模式,例如:

    require({"async":false});
    

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

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

    【讨论】:

    • 从 AMD API 来看,我认为这可能是 Dojo 的一个错误。我使用的语法不是 require(string) 或 require(array, function) 它是 require(array) 模块肯定还没有加载,因为我在单元测试中调用它,而我特别不需要事先。它是同步加载的,因为我使用 fiddler 将调用的延迟增加了 2000 毫秒,它等待它加载。
    • 我试图复制它,但无法复制(同时使用 v1.9 和 v.1.7.2)。我已经像您一样使用了数组格式(没有回调),但它仍然异步加载。也许您正在使用不同的设置?我有 {cacheBust:true, async:true} - 尝试使用本地 Dojo 并使用 Google CDN。即使它是同步工作的,我也会假设这将在未来和随机时间切换到异步 - 即。它可能在加载程序中使用了未知缺陷。我不是 Dojo 加载器方面的专家,所以我不能确定这是否是正确的行为。
    猜你喜欢
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多