为何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
相关产品推荐
相关产品推荐

