我正在编写AMD国际化模块。它导出一个函数,它接收一个字符串进行翻译并以类似于gettext的方式返回翻译。
我需要从所述模块中加载相应的翻译文件,但必须同步完成,并且与设置模块中的定义相关。
如何同步需要模块然后同步需要另一个模块?
答案 0 :(得分:0)
每当您看到使用RequireJS并且出现的代码同步运行时,那只是外观。例如,您可能会看到:
define(function (require, exports, module) {
var foo = require("foo");
// ...
});
并认为require("foo")
只是一个同步调用。从某种意义上说, 是同步的,因为它会立即返回一个值。但是,您没有看到的是模块定义的处理方式如下:
define(["require", "exports", "module", "foo"], function (require, exports, module) {
var foo = require("foo");
// ...
});
在RequireJS运行传递给foo
的回调之前,模块define
是异步加载的,因此require("foo")
并非真正异步。它看起来就是这样。
这些伪同步调用如何工作的一个结果是,您通常无法调用require(x)
,其中x
是在运行时计算的字符串。 (请注意,您可以调用require(x)
,其中x
是在运行时计算的数组,并且可以跟随可选的回调。这是“常规”异步require
。这里没问题。)我说“一般”,因为有些情况下它可以工作。例如,如果x
有一组已知且可能较小的值,那么可以定义您的模块:
define(["a", "b", "c"], function () {
var x = something(); // Where something() can be only return "a", "b", or "c".
var module_x = require(x);
// ...
});
这样可行,因为我列出了我可能想要在define
调用的依赖项中使用的所有可能模块,并且因为something()
只能返回已经加载的模块的名称。如果预先知道集合或者要求所有可能的模块都会破坏模块化的目的,那么你就无法做到这一点。我希望在国际化模块的情况下,你不想加载所有语言,所以你不能这样做。
RequireJS本身不会在这里工作。
你可以做的是让你的国际化模块返回promises而不是字符串。或者可能有一个插件可以帮助但我不知道它。