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

为何Mocha测试中带async执行器的Promise会超时而非抛错?

为什么带async的Promise执行器会导致Mocha测试超时?
  • Promise执行器的核心特性:Promise构造函数的执行器函数是同步执行的,但如果给它加上async前缀,它就变成了异步函数——而异步函数的本质是返回一个Promise,且内部抛出的错误会被自动捕获,转化为自身返回Promise的reject原因。

  • 第一种超时情况的原因:
    当执行器是async函数时,内部抛出的错误会被async函数自动捕获,变成这个执行器函数自身返回的Promise的reject结果。但Promise构造函数不会监听执行器函数返回的Promise,它只认你主动调用res()或rej()的操作。这就导致外层的new Promise永远不会被resolve或reject,await会一直等待,直到Mocha触发超时。

    对应的代码:

    describe("myTest", () => {
      it("myTest-0", async () => {
        await new Promise(async (res, rej) => {
          throw new Error("this is error");
        });
      });
    });
    
  • 第二种立即报错情况的原因:
    当执行器是普通同步函数时,内部抛出的错误会被Promise构造函数直接捕获,它会自动调用rej()把外层Promise置为rejected状态。此时await会立刻处理这个reject,测试也就直接抛出错误,不会超时。

    修正后的正确代码(原问题中it回调漏写async,否则await无法运行):

    describe("myTest", () => {
      it("myTest-0", async () => {
        await new Promise((res, rej) => {
          throw new Error("this is error");
        });
      });
    });
    
  • 总结:永远不要给Promise的执行器加async,完全没必要,反而会导致错误被“吞掉”,让Promise一直处于pending状态。如果要在执行器里写异步逻辑,直接用普通函数,完成后调用res()/rej()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:06