Доступ к статическим свойствам в Coffeescript - PullRequest
0 голосов
/ 22 мая 2018

Имея в виду следующий код

a.coffee

B = require './b'
C = require './c'

console.log B.someStaticVar
C.checkB()

b.coffee

C = require './c'

class B
  @someStaticVar: 1

module.exports = B;

c.coffee

B = require './b'

class C
  @checkB: ->
    console.log B.someStaticVar

module.exports = C

Я пытаюсь понять, почему статическое свойство b не определено при доступе c , но возвращается 1 при доступе a

Выход:

$ coffee a.coffee
1
undefined

1 Ответ

0 голосов
/ 22 мая 2018

Похоже, у вас есть круговая ссылка.

  1. A загружает B
  2. B загружает C
  3. C загружает B
    • Но B не завершает загрузку, поэтому здесь это пустой объект
  4. C завершает загрузку
  5. B завершает загрузку
  6. A загружает C - он уже загружен, поэтому он просто получает ссылку.
  7. Когда загрузка завершится, ваши 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...