<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回调中的assert失败,并引发未捕获的错误并停止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 等级