javascript - async/await ,未处理的 promise 拒绝已弃用

标签 javascript ecmascript-6 async-await

当我使用 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/

相关文章:

javascript - JqG​​rid 分页器问题 - 总页数和记录显示不正确

javascript - JQuery 以后会不会存在?

javascript - 获取 chrome 扩展以打开页面,而不是弹出窗口

javascript - 过滤逻辑过于严格

c# - 在 async/await 中使用 ThreadStatic 变量

javascript - 选择选项后禁用输入字段

javascript - ES6 模块导入是否执行导入文件中的代码?

javascript - 如何访问 Web 组件上的 observedAttributes

amazon-web-services - Promise.all(promiseList) 不起作用,但 Promise.all(promiseList[0]) 起作用

node.js - 在 Node.js 中发出多个 get 请求并跟踪它们的响应