【发布时间】:2016-11-22 17:45:29
【问题描述】:
这个问题可能看起来像许多其他问题的重复,但我在任何地方都找不到我的错误。
问题是 async.each 抛出“回调已被调用”。这是 sn-p(我将异步回调命名为 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
提前致谢。
【问题讨论】:
-
github.com/22sk/telegramjs/blob/master/telegram/requires.js#L16 缺少 return 语句以防止
result被调用两次? (因此堆栈跟踪指向第 21 行) -
啊,该死的。没想到这么远,谢谢。你会把它作为答案发布吗?
-
为了清楚起见,去掉箭头函数
标签: javascript node.js asynchronous callback