Предположим, что у меня есть асинхронная функция
static async update (id, data){
try {
//async function below
_DB.putsomedata()
return true
} catch(e){
//log errors
}
}
И хотя мне не нужен результат _DB.putsomedata()
, мне все равно нужно знать, завершилась ли функция update()
без ошибок.
Я провел некоторое тестирование и заметил, что результат всегда будет возвращать true (ожидается), но в случае его отказа ошибка никогда не попадает в блок catch, и это вызывает необработанное исключение.
Может ли кто-нибудь объяснить поведение?
Предполагая, что _DB.putsomedata
является async
функцией, вам нужно ее await
. В противном случае его обещание будет просто продолжаться в фоновом режиме, где оно в конечном итоге терпит неудачу и приведет к ошибке. В то же время ваш код будет продолжен, и блок try..catch
уже давно будет удален.
catch
: _DB.putsomedata().catch(console.error)
. Но тогда ваша функция update
не должна быть async
, потому что это не так.
Правильно скорректированные коды:
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
.
Функция putsomedata является асинхронной, поэтому возвращаемый statment вычисляется сразу после маркировки putsomedata как вычислимый (а не запуск, как для синхронной функции).
putsomedata возвращает, вероятно, обещание, которое будет разрешено после того, когда процессор будет доступен.
вы можете использовать функции.promise().then().catch()
await
перед вызовомasync
функции