Я использую 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));
И это тоже не работает ...
Есть ли способ сделать то, что я хочу здесь? Или мне просто не нужны массивы?
Там есть даже более простое решение для этого, просто создать замыкание, и вы можете сделать это с помощью 'bots.forEach (функция (СЭП) {...' и т.д. – adeneo
http://jsfiddle.net/ pymw4b3r/ – adeneo