2013-11-15 2 views
3

저는 현재 RequireJS의 초보자입니다. AMD 개념, 특히 RequireJS가 정의하는 방식과 관련하여 약간 문제가 있습니다.RequireJS - 즉시 모듈로드

내 목표는 필요한 특정 파서를 호출하는 스마트 로더를 빌드하는 것입니다.


내 요구 사항을 요약하면 :

(A) 나는 나의 로더 생성 : 새로운 로더 (소스)

(B) 소스로드 할 수있는 데이터를 나타냅니다. 그것은 간단한 문자열입니다.

(C) 로더 객체가 만들어집니다. 사용할 알고리즘을 결정하는 알고리즘을 실행합니다. 결국 파서를 원격 위치에서 다운로드합니다. 마지막으로, 은 동적으로 파서를로드합니다.


내 문제는 다음과 같습니다. 정의에서 모듈/플러그인을 어떻게로드 할 수 있습니까? 나는 어떤 파서가 필요한지 알 수 없기 때문에 이것을 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 또는 무언가를 사용합니다 호출하는 모든 함수 대신 require 콜백 함수.

+0

답변 해 주셔서 감사합니다. JQuery Deffered는 내 문제를 해결하는 데 도움이됩니다. :) –