2016-07-19 3 views
-1

Эта проблема может показаться дубликатом многих других, но я не могу найти свою ошибку нигде.Node.js async.each throws «Callback уже был вызван»

Проблема в том, что async.each выбрасывает «Callback уже был вызван». Вот фрагмент кода (я назвал асинхронный обратный вызов done, так что не запутаться с другими обратными вызовами в моем коде):

async.each(this.requirements, (requirement, done) => { 
    // That thing here passes the result as a callback 
    requirement.callback((result) => { 
    if (!result) { 
     // requirement not passed -> return error 
     done(true); // LINE 42 
    } else { 
     done(); // LINE 44 
    } 
    }, data, params, bot); 
}, (err) => { // 'done' callback 
    log.info('handler', 
    `Handler '${this.label}' ${err ? 'failed' : 'succeeded'}`); 
    // if any requirement did not pass, do not execute handler callback 
    if (!err) this.callback(data, params, bot); 
}); 

Вот трассировки стеки из него:

C:\Users\samuel\Code\node\sk22tgjs\node_modules\async\dist\async.js:837 
      if (fn === null) throw new Error("Callback was already called."); 
         ^

Error: Callback was already called. 
    at C:\Users\samuel\Code\node\sk22tgjs\node_modules\async\dist\async.js:837:34 
    at requirement.callback (C:\Users\samuel\Code\node\sk22tgjs\node_modules\telegramjs\core\handler.js:44:11) 
    at Requirement.exports.command.Requirement.callback (C:\Users\samuel\Code\node\sk22tgjs\node_modules\telegramjs\telegram\requires.js:21:5) 
    at async.each (C:\Users\samuel\Code\node\sk22tgjs\node_modules\telegramjs\core\handler.js:39:19) 
    at C:\Users\samuel\Code\node\sk22tgjs\node_modules\async\dist\async.js:2953:18 
    at replenish (C:\Users\samuel\Code\node\sk22tgjs\node_modules\async\dist\async.js:872:19) 
    at C:\Users\samuel\Code\node\sk22tgjs\node_modules\async\dist\async.js:878:27 
    at C:\Users\samuel\Code\node\sk22tgjs\node_modules\async\dist\async.js:840:18 
    at requirement.callback (C:\Users\samuel\Code\node\sk22tgjs\node_modules\telegramjs\core\handler.js:44:11) 
    at Requirement.callback (C:\Users\samuel\Code\node\sk22tgjs\node_modules\telegramjs\core\requires.js:19:5) 

Интересного Дело в том, что проблема возникает только при вызове done(true). Тем не менее, эта ошибка возникает в строке 44, а не 42.

Вы также можете увидеть поврежденный код на GitHub, особенно testing ветвь: https://github.com/22sk/telegramjs

Спасибо заранее.

+0

https://github.com/22sk/telegramjs/blob/master/telegram/requires.js#L16 отсутствует оператор возврата, чтобы предотвратить 'result' от вызывался дважды? (следовательно, почему трассировка стека указывает на строку 21) –

+0

Aaah, damn. Не думал так далеко, спасибо. Не могли бы вы разместить его в качестве ответа? – 22samuelk

+0

избавиться от функций стрелок для большей ясности –

ответ

1

Когда команда не найдена, вызываются как успех, так и отказ, а не просто отказ.

https://github.com/22sk/telegramjs/blob/5b85f04fe890a8fd32b373edb97bfebc923156b1/bot/telegram/requires.js

exports.command = new Requirement({ 
    label: 'command', 
    requires: requires.has('message', 'text'), 
    callback: (result, data, params, bot) => { 
    const command = new Command(data.message.text); 
    if (!command.valid || command.bot && bot.me.username !== command.bot) { 
     // command is not valid or not meant to be handled by this bot 
     result(false); // <--- ### Missing return ### ---> 
    } 
    // command is valid and should be handled by this bot 
    // write command into data 
    params.command = command; 
    result(true); 
    } 
}); 
Смежные вопросы