当我使用 async await 函数时,我收到 deprecationWarning: unhandled promise rejections are deprecated
。这个错误要么是在没有 catch block 的情况下在异步函数内部抛出,要么是因为拒绝了一个没有用 .catch() 处理的 promise 。
export const publish = async (exchange, type, message) => {
try {
const connection = await amqplib.connect(connectionString)
const channel = await connection.createChannel()
channel.assertExchange(exchange, config.messageQueue.exchange.type, {durable: true})
logger.silly(`publishing message to ${exchange}`)
channel.publish(exchange, '', type.encode(message).finish())
}
catch (e) {
logger.warn(`error while publishing message, ${e}`)
throw e
}
}
const startConsuming = async () => {
try {
const {Get, Sort, Cleanup, ...elasticMessages} = expectedMessages
await init(Object.keys(elasticMessages))
amqpService(expectedMessages, onMessage)
publish(`${config.messageQueue.exchange.prefix}Cleanup`, contracts.televic.historyLogging.Call, '')
} catch (e) {
logger.error('error while establishing connection to message bus', e)
}
}
最佳答案
前面没有await
,后面没有.catch
:
publish(`${config.messageQueue.exchange.prefix}Cleanup`, contracts.televic.historyLogging.Call, '')`
但是publish
是一个async
函数,所以这个函数不会抛出错误,但是它返回的Promise会被错误拒绝。因此,如果在 catch
block 中调用了 throw e
,则 publish
会因该错误而被拒绝,并且不会处理此拒绝。
所以代码必须是这样的:
const startConsuming = async () => {
try {
const {Get, Sort, Cleanup, ...elasticMessages} = expectedMessages
await init(Object.keys(elasticMessages))
amqpService(expectedMessages, onMessage)
await publish(`${config.messageQueue.exchange.prefix}Cleanup`, contracts.televic.historyLogging.Call, '')
} catch (e) {
logger.error('error while establishing connection to message bus', e)
}
}
关于javascript - async/await ,未处理的 promise 拒绝已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49666129/