<p>async.auto&try ... catchの奇妙なケース</p>

作成日 2017年07月26日  ·  3コメント  ·  ソース: caolan/async

どのバージョンの非同期を使用していますか?
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.
question

最も参考になるコメント

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)

全てのコメント3件

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理にかなっています、ヒントをありがとう!

(また、こんにちは!👋)

👋😊

このページは役に立ちましたか?
0 / 5 - 0 評価