require
函数听起来像它可以用于您的目的。它允许加载模块,但不能定义新的模块。
您的装载机可以调用的函数,例如在需要时以下动态加载模块:
function loadParser(name, fn) {
require(["parsers/" + name], fn);
}
name
将是解析器的名称或路径或东西(注意,我的路只是一个例如)和fn
是加载完成后调用的回调函数。函数的第一个参数是加载的模块。
此功能可以被放置在您的装载机对象或只是坐在里面的定义:
define(function() {
function Loader(text) {
this.text = text;
this.parser = null;
this.loadParser();
}
Loader.prototype.loadParser = function() {
var self = this;
var parserName = this.getParserName();
require(["parsers/" + parserName], function (Parser) {
self.parser = Parser;
self.parse();
});
}
Loader.prototype.getParserName = function() {
//mystery logic to determine language...
return "some-parser-name";
}
Loader.prototype.parse = function() {
if (!this.parser) {
throw "No parser loaded";
}
//do your parsing logic...
}
return Loader;
});
现在,如果我真的这样做了,我会用Q
或jQuery的deferreds或东西内解决解析器回调函数,而不是所有那些函数调用。
感谢您的回答。 JQuery Deffered帮助我解决我的问题:) –