Похоже, у вас есть круговая ссылка.
- A загружает B
- B загружает C
- C загружает B
- Но B не завершает загрузку, поэтому здесь это пустой объект
- C завершает загрузку
- B завершает загрузку
- A загружает C - он уже загружен, поэтому он просто получает ссылку.
- Когда загрузка завершится, ваши
console.log
строки в конце файла будут выполнены.
Вот версия ваших 3 модулей, которая иллюстрирует это лучше:
a.coffee
B = require './b'
C = require './c'
console.log B.someStaticVar
C.checkB()
b.coffee
C = require './c'
console.log 'in b.coffee, we have loaded C: ', C
class B
@someStaticVar: 1
module.exports = B;
c.coffee
B = require './b'
console.log 'in c.coffee, we have loaded B: ', B
class C
@checkB: ->
console.log B.someStaticVar
module.exports = C
У вас есть два варианта исправления этой циклической зависимости в commonjs:
1.Ленивая загрузка
Не требуется ./b
в c.coffee
, пока вы не выполните свою функцию.К тому времени, когда вы наберете C.checkB
внутри a.coffee
B, будет полностью загружен, и правильный вызов будет возвращен из требуемого вызова
class C
@checkB: ->
B = require './b'
console.log B.someStaticVar
module.exports = C
2.Рефакторинг
B
и C
тесно связаны между собой.Попробуйте переписать их, чтобы они содержались в одном файле.Вы можете просто удалить require './c'
из b.coffee
.Хотя я предполагаю, что это в этом примере, поскольку ваш код более сложный и нуждается в нем.
a.coffee
{ B, C } = require './b'
console.log B.someStaticVar
C.checkB()
b.coffee
class B
@someStaticVar: 1
class C
@checkB: ->
console.log B.someStaticVar
module.exports =
C: C
B: B