Необработанный отказ от обещания на блоке try / catch

1

Предположим, что у меня есть асинхронная функция

static async update (id, data){
  try { 
     //async function below
     _DB.putsomedata()

     return true
  } catch(e){
    //log errors
  }
}

И хотя мне не нужен результат _DB.putsomedata(), мне все равно нужно знать, завершилась ли функция update() без ошибок.

Я провел некоторое тестирование и заметил, что результат всегда будет возвращать true (ожидается), но в случае его отказа ошибка никогда не попадает в блок catch, и это вызывает необработанное исключение.

Может ли кто-нибудь объяснить поведение?

  • 0
    потому что вы не поставили await перед вызовом async функции
Теги:
async-await
asynchronous

3 ответа

2
Лучший ответ

Предполагая, что _DB.putsomedata является async функцией, вам нужно ее await. В противном случае его обещание будет просто продолжаться в фоновом режиме, где оно в конечном итоге терпит неудачу и приведет к ошибке. В то же время ваш код будет продолжен, и блок try..catch уже давно будет удален.

  • 0
    Так что у меня нет выбора, кроме как использовать await? Я надеялся увеличить скорость, не дожидаясь результатов, в которых я не нуждаюсь, но все еще обрабатывал исключение, если оно терпит неудачу.
  • 0
    Альтернативой является цепочка catch : _DB.putsomedata().catch(console.error) . Но тогда ваша функция update не должна быть async , потому что это не так.
0

Правильно скорректированные коды:

static async update (id, data){
  try { 
     await _DB.putsomedata()
     return true
  } catch(e){
    //log errors
  }
}

Вы должны поместить ключевое слово await перед выражением _DB.putsomdata(), чтобы приостановить выполнение функции асинхронизации и await принятого разрешения Promise, прежде чем перейти к следующей строке, которая return true.

Отсутствие ключевого слова await приведет к продолжению работы программы, другими словами, программа не останавливается и не ждет. По этой причине он всегда возвращает true. Надеюсь, этот дополнительный ответ поможет вам полностью понять поведение async function.

0

Функция putsomedata является асинхронной, поэтому возвращаемый statment вычисляется сразу после маркировки putsomedata как вычислимый (а не запуск, как для синхронной функции).

putsomedata возвращает, вероятно, обещание, которое будет разрешено после того, когда процессор будет доступен.

вы можете использовать функции.promise().then().catch()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню