2013-11-15 142 views
3

我目前是RequireJS的初学者,我对AMD的概念有点麻烦,特别是RequireJS定义它的方式。RequireJS - 动态加载模块

我的目标是构建一个智能加载程序,调用他需要的特定解析器。


总结我的需求:

(A)创建我装载机:新的Loader(

(B)表示加载数据。这是一个简单的字符串。 (C)创建加载器对象。它执行一些算法来决定什么是最好的Parser使用。最终,它从远程位置下载解析器。最后,它动态地加载解析器。


我的问题是这样的:我怎么能加载一个模块/插件而不用在定义中说明它?我不能在define([theParserHere])中设置它,因为我无法知道需要哪个解析器。

回答

2

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或东西内解决解析器回调函数,而不是所有那些函数调用。

+0

感谢您的回答。 JQuery Deffered帮助我解决我的问题:) –