【发布时间】:2014-05-17 08:50:27
【问题描述】:
我正在编写一个 AMD 国际化模块。它以类似于 gettext 的方式导出一个接收要翻译的字符串并返回翻译的函数。
我需要从所述模块中加载适当的翻译文件,但它必须同步完成并且相对于设置模块中的定义。
我怎样才能同步需要一个模块,然后同步需要另一个模块?
【问题讨论】:
标签: javascript internationalization requirejs js-amd
我正在编写一个 AMD 国际化模块。它以类似于 gettext 的方式导出一个接收要翻译的字符串并返回翻译的函数。
我需要从所述模块中加载适当的翻译文件,但它必须同步完成并且相对于设置模块中的定义。
我怎样才能同步需要一个模块,然后同步需要另一个模块?
【问题讨论】:
标签: javascript internationalization requirejs js-amd
每当您看到使用 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");
// ...
});
模块foo 是在RequireJS 运行传递给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 本身在这里不起作用。
您可以做的是让您的国际化模块返回承诺而不是字符串。或者可能有一个插件可以提供帮助,但我不知道。
【讨论】: