<p>async.auto и любопытный случай попытки ... поймать</p>

Созданный на 26 июл. 2017  ·  3Комментарии  ·  Источник: caolan/async

Какую версию 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 рейтинги