2015-06-13 2 views
0

Я использую Node.js и steam-node, чтобы написать пару ботов для пара (хранимых на массиве), каждый бот имеет свою собственную учетную запись и прочее. Итак, для начала, вот часть моего кода:Node.js обход ошибки «слушатель должен быть функцией»

function onLogon(index){ 
    console.log('[STEAM] Logged in on bot ' + index); 
    bots[index].setPersonaState(Steam.EPersonaState.Online); 
    /*do other stuff*/ 
} 

for (var i = 0; i < bots.length; i++){ /*Foreach of the bots, assign a loggedOn even listener */ 
    bots[i].on('loggedOn', onLogon(i)); 
} 

И этот код дает мне "слушатель должен быть функцией. Теперь, я знаю, что означает эта ошибка, я должен установить слушателя событий, как это:

bots[i].on('loggedOn', onLogon); 

, но это не работает, потому что мне нужно передать переменную к событию.

Я мог бы сделать это:

for (var i = 0; i < accounts.length; i++){ 
    bots[i].on('loggedOn', function() { 
     console.log('[STEAM] Logged in on bot ' + i); 
     bots[i].setPersonaState(Steam.EPersonaState.Online); 
     //... 
    }); 
} 

, но это также не работает, потому что я передается по ссылке, и он бросает TypeError: Cannot read property 'setPersonaState' of undefined таким образом.

bots[i].on('loggedOn', (function(index) { 
     console.log('[STEAM] Logged in on bot ' + i); 
     bots[index].setPersonaState(Steam.EPersonaState.Online); 
     //... 
    })(i)); 

И это тоже не работает ...

Есть ли способ сделать то, что я хочу здесь? Или мне просто не нужны массивы?

+0

Там есть даже более простое решение для этого, просто создать замыкание, и вы можете сделать это с помощью 'bots.forEach (функция (СЭП) {...' и т.д. – adeneo

+0

http://jsfiddle.net/ pymw4b3r/ – adeneo

ответ

0

При запуске

bots[i].on('loggedOn', onLogon(i)); 

вы сразу вызова onLogon, и передавая результат on. То, что вы действительно хотите, чтобы связать первый аргумент, не называя его, что может быть сделано следующим образом:

bots[i].on('loggedOn', onLogon.bind(null, i)); 

null потому, что первый аргумент bind контекст (или this значения), которое мы не» Не волнуйся.

+0

Спасибо, человек, работал безупречно. – Mark

1

@ Ответ Аарона - это, вероятно, путь, но, как альтернатива, корпус может работать.

function onLogon(bot, index){ 
    return function() { 
     console.log('[STEAM] Logged in on bot ' + index); 
     bot.setPersonaState(Steam.EPersonaState.Online); 
     /*do other stuff*/ 
    }; 
} 

for (var i = 0; i < bots.length; i++){ /*Foreach of the bots, assign a loggedOn even listener */ 
    bots[i].on('loggedOn', onLogon(bots[i], i)); 
} 

Или построить ответ @ Аарона, передать бота как контекст функции.

function onLogon(index){ 
    console.log('[STEAM] Logged in on bot ' + index); 
    this.setPersonaState(Steam.EPersonaState.Online); 
    /*do other stuff*/ 
} 

for (var i = 0; i < bots.length; i++){ /*Foreach of the bots, assign a loggedOn even listener */ 
    bots[i].on('loggedOn', onLogon.bind(bots[i], i)); 
}