2014-11-07 5 views
1

감안할 때 :순환 종속성을 처리하는 방법은 무엇입니까?

  • StringPreconditionsStringPreconditions
  • PreconditionsObjectPreconditionsStringPreconditions에 게이트 키퍼입니다 (그 방법 중 하나는 서브 클래스를 반환)에 ObjectPreconditions
  • ObjectPreconditions가 따라 확장 (확인하고 그들이 인스턴스를 반환하기 전에 모두로드)
  • UserPreconditions
,

이 코드를 가지고 :

define(["ObjectPreconditions"], function(ObjectPreconditions) 
{ 
    console.log("Inside StringPreconditions"); 

    function StringPreconditions() {} 
    StringPreconditions.prototype = Object.create(ObjectPreconditions.prototype); 
    StringPreconditions.prototype.constructor = ObjectPreconditions; 
    return StringPreconditions; 
}); 

define(["require"], function(require) 
{ 
    console.log("Inside ObjectPreconditions"); 

    // Resolve circular dependencies 
    var StringPreconditions; 
    require(["StringPreconditions"], function(theStringPreconditions) 
    { 
    StringPreconditions = theStringPreconditions; 
    console.log("ObjectPreconditions finished loading StringPreconditions"); 
    }); 

    function ObjectPreconditions() {} 
    ObjectPreconditions.prototype.isInstanceOf(type) 
    { 
    console.log("ObjectPreconditions.isInstanceOf() invoked"); 
    if (type === String) 
     return new StringPreconditions(); 
    } 
}); 

define(["ObjectPreconditions", "StringPreconditions"], function(ObjectPreconditions, StringPreconditions) 
{ 
    console.log("Inside Preconditions"); 
    var Preconditions = {}; 

    Preconditions.requireThat(parameter) = function() 
    { 
    return new ObjectPreconditions(parameter); 
    }; 
    return Preconditions; 
}); 

define(["Preconditions"], function(Preconditions) 
{ 
    console.log("Inside User"); 
    function User() {} 
    User.prototype.doSomething = function() 
    { 
    var StringPrecondition = Preconditions.requireThat("test").isInstanceOf(String); 
    } 
}); 

문제는 그 나는이로드 순서 얻는 시간의 10 % :

  • 내부 전제 조건
  • 내부 ObjectPreconditions
  • 사용자 내부를
  • 인사이드 StringPreconditions
  • ObjectPre conditions.isInstanceOf() (CRASH StringPreconditions이 정의되어 있기 때문에)
  • ObjectPreconditions 완료 로딩 StringPreconditions

는 이미 http://requirejs.org/docs/api.html#circular을 읽었습니다하지만 나는 그들이 내가 같은 일을하고있다 생각합니다.

아이디어가 있으십니까?

답변

1

알아 냈습니다 : 순환 종속성에 의존하는 함수를 정의하는 "게이트 키퍼"파일을 만들어야합니다.

  1. ObjectPreconditions.js에서 AbstractObjectPreconditions.js으로 이름을 변경하십시오.
  2. 새로운 ObjectPreconditions.js 파일 (새 게이트 키퍼)을 만듭니다.
  3. ObjectPreconditions.js
  4. 사용자 코드해야 require(ObjectPreconditions)AbstractObjectPreconditions.js에서 어떤 순환 종속성을 이동
  5. . 순환 종속성과 관련된 코드 (예 : 하위 클래스)는 require(AbstractObjectPreconditions)이어야합니다. 여기

는 결과 코드는 모습입니다 :

define(["AbstractObjectPreconditions"], function(ObjectPreconditions) 
{ 
    console.log("Inside StringPreconditions"); 

    function StringPreconditions() {} 
    StringPreconditions.prototype = Object.create(ObjectPreconditions.prototype); 
    StringPreconditions.prototype.constructor = ObjectPreconditions; 
    return StringPreconditions; 
}); 

define(["require"], function(require) 
{ 
    console.log("Inside AbstractObjectPreconditions"); 

    function ObjectPreconditions() {} 
    return ObjectPreconditions; 
}); 

define(["AbstractObjectPreconditions"], function(ObjectPreconditions) 
{ 
    // Gatekeeper for circular dependencies 
    ObjectPreconditions.prototype.isInstanceOf(type) 
    { 
    console.log("ObjectPreconditions.isInstanceOf() invoked"); 
    if (type === String) 
     return new StringPreconditions(); 
    } 

    return ObjectPreconditions; 
}); 


define(["ObjectPreconditions", "StringPreconditions"], function(ObjectPreconditions, StringPreconditions) 
{ 
    console.log("Inside Preconditions"); 
    var Preconditions = {}; 

    Preconditions.requireThat(parameter) = function() 
    { 
    return new ObjectPreconditions(parameter); 
    }; 
    return Preconditions; 
}); 

define(["Preconditions"], function(Preconditions) 
{ 
    console.log("Inside User code"); 
    function User() {} 
    User.prototype.doSomething = function() 
    { 
    var StringPrecondition = Preconditions.requireThat("test").isInstanceOf(String); 
    } 
}); 
+1

이 올바른있을 수 있습니다,하지만 당신은 등 변수 이름을 단순화 할 수 있습니다, 따라하기가 매우 어렵다 찾을? –

관련 문제