Эта проблема может показаться дубликатом многих других, но я не могу найти свою ошибку нигде.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
Спасибо заранее.
https://github.com/22sk/telegramjs/blob/master/telegram/requires.js#L16 отсутствует оператор возврата, чтобы предотвратить 'result' от вызывался дважды? (следовательно, почему трассировка стека указывает на строку 21) –
Aaah, damn. Не думал так далеко, спасибо. Не могли бы вы разместить его в качестве ответа? – 22samuelk
избавиться от функций стрелок для большей ясности –