Я использую async
await
в своем коде NodeJs, и структура кода выглядит следующим образом.
async function main(){
try {
await someFunctionThatReturnsRejectedPromise()
} catch(e) {
console.log(e)
}
}
async function someFunctionThatReturnsRejectedPromise() {
try {
await new Promise((resolve,reject) => {
setTimeout(() => {
reject('something went wrong')
}, 1000);
})
} catch(e) {
return Promise.reject(e)
} finally {
await cleanup() // remove await here and everything is fine
}
}
function cleanup() {
return new Promise(resolve => {
setTimeout(() => {
resolve('cleaup successful')
}, 1000);
})
}
main();
В блоке finally я делаю некоторые async
очистка, которая обязательно разрешит. Но этот код выдает PromiseRejectionHandledWarning
(node:5710) UnhandledPromiseRejectionWarning: something went wrong
(node:5710) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:5710) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
something went wrong
(node:5710) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)
Насколько я понимаю, я не оставляю здесь никаких обещаний без внимания. Что я делаю неправильно? Должен ли finally
блокироваться синхронно по замыслу? Если да, то почему?
Обновление 1:
Если я конвертирую someFunctionThatReturnsRejectedPromise
в доброе старое then
и catch
, это работает без проблем :
function someFunctionThatReturnsRejectedPromise() {
return (new Promise((resolve,reject) => {
setTimeout(() => {
reject('something went wrong')
}, 1000);
})).catch(e => {
return Promise.reject(e)
}).finally(() => {
return cleanup()
})
}
Обновление 2: (Понял проблему)
Если я await
вернул Обещание, проблема решена.
return await Promise.reject(e)
И это заставляет меня понять, что я делал неправильно. Я нарушал цепочку await
(частично синоним того, что не возвращался синтаксис Promise
в then
/ catch
). Спасибо всем:)