2014-04-24 1 views
1

필자는 이상한 동작이 필요하므로 피하는 방법을 모르거나 기본이 잘못되었습니다. 'communication.data'자체가 '응용 프로그램'(도시 코드)를 필요로하기 때문에,순환 의존성을 해결할 때 순환 형식을 요구할 때 동기 형식을 사용합니다. 이름 바꾸기가 필요하지 않은 경우

define (require) -> 

    potoo = require "potoo" 
    service = require "communication.data" 

    downloadIfNeeded = -> 
    # ... 
    service.download() 

    new potoo.App 
    pageContainer: potoo.UI.NGStylePage 
    userRequired: true 
    stdRoute:  "overview" 
    onLogin:  downloadIfNeeded 

이 작동하지 않을 :

는 다음과 같은 코드를 생각해 보자. 그래서 우리는 명백하게 순환 의존성을가집니다. '잡히지 않은 오류 : 모듈 이름'앱 '이 컨텍스트에 대해 아직로드되지 않았습니다.'

downloadIfNeeded 함수는 사용자가 실제로 무엇인가를 클릭 할 때까지 호출되지 않기 때문에, 다음 작동해야합니다 :

define (require) -> 

    potoo = require "potoo" 

    downloadIfNeeded = -> 
    service = require "communication.data" 
    service.download() 

    ... 

그러나 실제로 위와 같은 오류가 throw됩니다. 그것을 작동시키기 위해서, 나는 약간의 해킹을 사용해야한다. 나는 다른 이름으로 요구 함수의 별칭을 지정한다 :

define (require) -> 

    potoo = require "potoo" 
    reqs = require 

    downloadIfNeeded = -> 
    service = reqs "communication.data" 
    service.download() 

    ... 

이것이 최선의 방법인가? 또는 requirejs에서도 지원되는 CommonJS 스타일 (module.export)을 권하고 싶습니다.

+0

질문 하단의 사이드 노트를 삭제했습니다. 실제로 다른 * 질문이었습니다 (원형 문제를 대답해도이 두 번째 질문에 답하지 않아도됩니다). 또한, 당신이 요구 한 것은 의견에 기반하거나 너무 광범위하기 때문에 SO에 적합하지 않습니다. (어떤 목적을 위해 "권장"합니까? 요구 사항은 일부 측면에서는 RequireJS보다 우수 할 수도 있지만 다른 부분에서는 그렇지 않을 수도 있습니다.) – Louis

답변

0

여기 테스트를 완료하여 해결책을 찾을 수있었습니다. 당신이해야하는 것은이 자바 스크립트에 해당합니다 :이 require의 동기 형성하는 (가짜)를 사용할 수있게하기에 충분

define(function (require) { 

. 그러나 RequireJS는 동기식 require을 사용할 때 발생하는 오류를 제공하며 순환 의존성을가집니다. 당신이 필요로하는 것은 이것이다 :

define(function (require, exports, module) { 

이 모듈은 값을 내보낼 exports를 사용하고 그 결과 RequireJS 모듈이 초기화 완료되면 업데이트 할 수있는 개체를 가질 수 있도록한다.