2013-06-17 2 views
8

В принципе, идея состоит в том, что модуль «sub» создает объект, и этот объект должен быть частью библиотеки утилит, которая является «основным» модулем. Тем не менее, «суб» объект зависит на коммунальные услуги от «основной»:Как решить круговую зависимость в Require.js?

// Main module 
define(['sub'], function(sub) { 
    var utils = { 
     utilityMain: function() { 
      // ... 
     }; 
     // ... 
    }; 

    tools.subModule = sub; 

    return tools; 
}); 

// Sub module 
define(['main'], function(main) { 
    return new (function() { 

     // Singleton object using functions in main module 
     var somestuff = function() { 
      main.utilityMain(); 
      // etc 
     }; 
    })(); 
}); 

Как я могу добиться этого с require.js, не создавая черную дыру, которая поглотит всю планету?

спасибо.

ответ

6

Есть несколько вещей, предлагаемых в the docs:

b может принести a позже после того, как модули были определены с помощью метода require() (обязательно указать требуют как зависимость, поэтому правый контекст используется для посмотреть a)

например:

// Sub module 
define(['require'], function(require) { 
    return new (function() { 

     // Singleton object using functions in main module 
     var somestuff = function() { 
      require('main').utilityMain(); 
      // etc 
     }; 
    })(); 
}); 

или

вы могли бы использовать вместо exports, чтобы создать пустой объект для модуля, который доступен сразу для справки других модулей

например:

// Main module 
define(['sub', 'exports'], function(sub, exports) { 
    exports.utilityMain: function() { 
     // ... 
    }; 

    exports.subModule = sub.sub; 
}); 
// Sub module 
define(['main', 'exports'], function(main, exports) { 
    exports.sub = new (function() { 

     // Singleton object using functions in main module 
     var somestuff = function() { 
      main.utilityMain(); 
      // etc 
     }; 
    })(); 
}); 

и

Циклические зависимости встречаются редко, и usuall y признак того, что вы, возможно, захотите переосмыслить дизайн

+0

«переосмыслите дизайн», я полностью согласен, но на данный момент это немного сложно. Я уже исследовал и изучил то, что вы предлагаете ... Я пытался обернуть голову вокруг объекта 'export' в течение последних двух дней, и теперь вы говорите мне, что он доступен * немедленно *? Я думал, что 'export' возвращается' define'/'require' только после возобновления выполнения заводской функции? На втором взгляде кажется, что вы предполагаете, что 'main' должен возобновить выполнение только один раз, когда' sub' возобновляет? – pilau

+0

Я был бы очень признателен, если бы вы действительно могли изложить порядок, в котором все это происходит. Я думаю, что именно здесь я не понимаю, как это решение решает мою проблему. Благодаря! – pilau

+1

Использование 'export' позволяет только каждому модулю иметь ссылку на какой-либо объект вместо' undefined' для каждого модуля. Вы не можете сразу использовать _functions_ любого из модулей, но можете быть уверены, что ссылки будут правильно настроены во время выполнения. Подумайте о параллельности обоих определений модулей. Они оба знают, где _look_ для другого модуля, но ни один из них не может взаимодействовать, пока они не будут завершены. – freejosh

Смежные вопросы