2016-12-24 2 views
0

Я пытаюсь написать пакет для текстового редактора Atom, а в моем основном классе (init.coffee) у меня есть массив внутри моего module.exports :Coffeescript: вызов функций массива из функции в том же объекте

servers: [] 

Я хочу, чтобы этот массив из функции в другой части module.exports, но у меня возникают проблемы.

Функция:

stas:() -> 
    dir = getFilePath() 
    d = fs.statSync dir 
    if !d.isDirectory() 
     dirError dir 
    else 
     s = new Server dir 
     s.init() 
     @servers.push s 
    return 

Я получаю эту ошибку:

Uncaught TypeError: this.servers.push is not a function 

я вызываю функцию так:

@events.add atom.commands.add ".tree-view", { 
    'atom-together:startServer': @stas 
    'atom-together:startClient': @stac 
    'atom-together:stopServer': @stos 
    'atom-together:stopClient': @stoc 
} 

Что такое правильный способ вызова этого массива в CoffeeScript?

ответ

3

Значение функции (AKA @) внутри функции JavaScript/CoffeeScript обычно зависит от того, как оно вызывается, а не там, где оно определено. Кроме того, @stas - это просто ссылка на функцию stas, и this будет тем, кем бы он ни назывался, когда эта функция вызывается.

Если вам нужна конкретная @ (AKA this) в функции обратного вызова, то либо определить его как bound function:

stas:() => # Note the => instead of -> 
    #... 

или связать его с помощью Function.prototype.bind при передаче его в системе событий:

@events.add atom.commands.add ".tree-view", { 
    'atom-together:startServer': @stas.bind(@) 
    #... 
} 

Кроме того, если вы определяете servers: [] на уровне класса, как это:

class C 
    servers: [] 

, то вы делите этот массив servers среди всех экземпляров вашего класса, и это может быть не то, что вы хотите. Вещи, определенные на уровне класса, совместно используются прототипом среди всех экземпляров. Например:

class C 
    a: [ ] 

c1 = new C 
c2 = new C 
c1.a.push 11 
console.log c1.a, c2.a 

поставит два [11] с в консоли, потому что c1.a и c2.a такие же массив. Обычно вам лучше определять изменяемые значения в вашем constructor, чтобы избежать этого совместного использования (если только вы этого не хотите); эта версия:

class C 
    constructor: (@a = [ ]) -> 

c1 = new C 
c2 = new C 
c1.a.push 11 
console.log c1.a, c2.a 

даст вам [11] и [] в консоли, и это, как правило, поведение, которое вы ищете.

+0

Спасибо вам большое :) добавление .bind работало! –