どのバージョンの非同期を使用していますか?
v2.5.0
どの環境で問題が発生しましたか(ノードバージョン/ブラウザバージョン)
v6.10.3
あなたは何をした?
async.auto({
returnOne: (callback) => callback(null, 1),
tryCatch: ["returnOne", (results, callback) => {
try {
assert(results.returnOne === 1);
return callback(null);
} catch (err) {
console.log(`Caught an error: ${err.message}`);
return callback(err);
}
}],
}, (err, results) => {
assert(results.returnOne !== 1);
console.log(`All Done!`);
});
何が起こると思いましたか?
最後のaync.autoコールバック内のアサートは失敗し、キャッチされないエラーをスローして、Node.jsプロセスを停止します。 私の実際の例では、Mocha内のコードのブロックをテストしています。このブロックはエラーを処理し、失敗の原因となったアサーションに関する情報とともにテストが失敗したことを報告します。
実際の結果はどうでしたか?
前の自動ステップのTry / Catchがエラーをキャッチし、tryCatchコールバックをもう一度呼び出すと、別のエラーが発生します。
async/dist/async.js:903
if (fn === null) throw new Error("Callback was already called.");
^
Error: Callback was already called.
try {
//...
return callback(null, result)
} catch (e) {
//..
return callback(e)
}
コールバックチェーンの後半で何かがスローされた場合(たとえば、アサーション)、 try
ブロックでキャッチされ、 catch
二重コールバックが発生するため、これは大きなアンチパターンです。 正しい方法:
let err, result
try {
result = doSomething()
} catch (e) {
err = e
}
callback(err, result)
@aearly理にかなっています、ヒントをありがとう!
(また、こんにちは!👋)
👋😊
最も参考になるコメント
コールバックチェーンの後半で何かがスローされた場合(たとえば、アサーション)、
try
ブロックでキャッチされ、catch
二重コールバックが発生するため、これは大きなアンチパターンです。 正しい方法: