You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决PromiseRejectionHandledWarning异步处理警告及Jest测试失败问题

问题根因

PromiseRejectionHandledWarning警告触发的核心是Promise被拒绝后,间隔了至少一个事件循环才挂载catch处理逻辑,你当前的代码看起来同步挂载了catch,但是存在几个隐藏的坑:

可能的问题点和修复方案

  • 确认WebPushClient.sendNotification的返回值类型
    部分第三方库的异步方法会返回类Promise对象(仅实现then方法的非原生Promise实例),这类对象链式调用catch时会延迟生成微任务,导致Promise拒绝事件先被全局捕获上报,catch处理逻辑才完成挂载,就会触发该警告。
    修复方法:手动包裹一层原生Promise保证catch同步生效,修改对应代码如下:
    const result = Promise.resolve(this.WebPushClient
        .sendNotification(subscription, JSON.stringify(message)))
        .catch(e => {
            // 原有catch逻辑保持不变
        })
    
  • 检查Jest测试逻辑是否正确处理异步返回值
    如果你测试notify方法时没有等待其返回的Promise执行完成,Jest会在异步错误处理逻辑执行前就销毁测试上下文,导致catch没有被正确触发,同时抛出警告和测试失败。
    错误的测试写法示例:
    test('测试notify方法', () => {
      notify(testTokens, testMessage)
    })
    
    正确的异步测试写法二选一即可:
    // 写法1:用async await等待执行完成
    test('测试notify方法', async () => {
      await notify(testTokens, testMessage)
    })
    
    // 写法2:返回Promise让Jest等待执行完成
    test('测试notify方法', () => {
      return notify(testTokens, testMessage)
    })
    
  • 排查revokeToken内部的Promise处理逻辑
    如果revokeToken方法内部存在未同步挂载catch的Promise,也会触发该警告,需要确保该方法内所有异步逻辑都同步做了错误处理,不存在孤立的拒绝Promise。

内容的提问来源于stack exchange,提问作者Webivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:45:00