当前位置: 首页 > 面试题库 >

NodeJS UnhandledPromiseRejection警告

孔鸿云
2023-03-14
问题内容

因此,我正在测试依赖于事件发射器的组件。为此,我想出了将Promises与Mocha + Chai结合使用的解决方案:

it('should transition with the correct event', (done) => {
  const cFSM = new CharacterFSM({}, emitter, transitions);
  let timeout = null;
  let resolved = false;
  new Promise((resolve, reject) => {
    emitter.once('action', resolve);
    emitter.emit('done', {});
    timeout = setTimeout(() => {
      if (!resolved) {
        reject('Timedout!');
      }
      clearTimeout(timeout);
    }, 100);
  }).then((state) => {
    resolved = true;
    assert(state.action === 'DONE', 'should change state');
    done();
  }).catch((error) => {
    assert.isNotOk(error,'Promise error');
    done();
  });
});

在控制台上,尽管正在调用拒绝函数,但我仍收到“ UnhandledPromiseRejectionWarning”消息,因为该函数立即显示消息“
AssertionError:Promise error”

(节点:25754)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):AssertionError:Promise错误:预期{对象(消息(showDiff,…)}虚假1)应以正确的事件进行转换

然后2秒后

错误:超时超过2000毫秒。确保在此测试中调用了done()回调。

自从执行catch回调以来,这甚至更奇怪(我认为由于某种原因断言失败阻止了其余的执行

现在,有趣的是,如果我将其注释掉,assert.isNotOk(error...)则测试运行正常,控制台中没有任何警告。就执行捕获而言,它仍然“失败”。
但是,我还是无法理解这些错误。有人可以启发我吗?


问题答案:

此问题是由以下原因引起的:

.catch((error) => {
  assert.isNotOk(error,'Promise error');
  done();
});

如果断言失败,它将引发错误。该错误将done()永远不会被调用,因为代码在此之前出错。这就是导致超时的原因。

“未处理的承诺拒绝” 也由断言失败造成的,因为如果一个错误在被抛出catch()的处理程序,
并没有后续的catch()处理程序,错误将得到吞噬(说明这篇文章)。该UnhandledPromiseRejectionWarning警告提醒你这个事实。

通常,如果要在Mocha中测试基于承诺的代码,则应依靠Mocha本身已经可以处理承诺的事实。您不应该使用done(),而是从测试中返回一个承诺。摩卡咖啡然后会自己捕获任何错误。

像这样:

it('should transition with the correct event', () => {
  ...
  return new Promise((resolve, reject) => {
    ...
  }).then((state) => {
    assert(state.action === 'DONE', 'should change state');
  })
  .catch((error) => {
    assert.isNotOk(error,'Promise error');
  });
});


 类似资料:
  • 云联壹云平台支持对宿主机、虚拟机、云账号等资源的相关指标进行监控告警,告警消息支持通过机器人、邮件、短信、飞书、钉钉、企业微信等通知渠道发送给用户。 告警策略 告警策略即针对监控指标设置阈值,当资源的指标超过阈值时,将会立即通过通知渠道向用户发送告警消息,使用户可以快速响应解决问题。 告警历史 告警历史显示系统中所有的触发告警以及恢复告警的告警策略和资源信息。 告警资源 告警资源即宿主机、云账号等

  • 我正在使用python处理一些图像,并尝试将一系列大小为961x509的图像转换为MP4电影文件。我已经这样做了,它正在工作,但我有一个相当恼人的问题,警告说这样的话: 警告:根:图像FFMPEG_WRITER警告:输入图像不能被macro_block_size=16整除,大小从(509L,961L)到(512L,976L),以确保与大多数编解码器和播放器的视频兼容性。若要防止调整大小,请使输入图

  • 问题内容: 我尝试了以下代码将列转换为“日期”: 要么 但出现以下错误: /Users/xyz/anaconda3/envs/sensor/lib/python3.6/site- packages/pandas/core/indexing.py:517:SettingWithCopyWarning:试图在DataFrame的切片副本上设置一个值。尝试改用.loc [row_indexer,col_

  • 主要内容:实例,可取消的警告(Dismissal Alerts),实例,警告(Alerts)中的链接,实例本章将讲解警告(Alerts)以及 Bootstrap 所提供的用于警告的 class。警告(Alerts)向用户提供了一种定义消息样式的方式。它们为典型的用户操作提供了上下文信息反馈。 您可以为警告框添加一个可选的关闭按钮。为了创建一个内联的可取消的警告框,请使用 警告(Alerts) jQuery 插件。 您可以通过创建一个 <div>,并向其添加一个 .alert class 和四个上

  • 注:内容翻译自 官方文档Alarm Pinpoint-web周期性的检查应用的状态,如果特定前置条件(规则)满足时则触发告警。 这些条件(默认)每3分钟被web模块中的后台批处理程序检查一次,使用最后5分钟的数据。一旦条件满足,批处理程序发送短信/邮件给注册到用户组的用户。 用户指南 配置菜单 注册用户 创建用户组 添加用户到用户组 设置告警规则 告警规则 SLOW COUNT / 慢请求数 当应

  • 用于页面中展示重要的提示信息。 基本用法 页面中的非浮层元素,不会自动消失。 Alert 组件提供四种主题,由type属性指定,默认值为info。 <template> <el-alert title="成功提示的文案" type="success"> </el-alert> <el-alert title="消息提示的文案" type="info">

  • Alert 警告 用于页面中展示重要的提示信息。 基本用法 页面中的非浮层元素,不会自动消失。 ::: demo Alert 组件提供四种主题,由type属性指定,默认值为info。 render() { return ( <div> <Alert title="成功提示的文案" type="success" /> <Alert title="消息提示的文案"

  • 用于页面中展示重要的提示信息。 基本用法 页面中的非浮层元素,不会自动消失。 Alert 组件提供四种主题, 由 type 属性指定,默认值为 info <el-alert type="success"> 成功提示的文案 </el-alert> <el-alert type="info"> 消息提示的文案 </el-alert> <el-alert type="warning"> 警告