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

如何等待WebSocket连接完成后再终止函数 解决Jest测试报错问题

问题原因

你当前编写的是同步函数,WebSocket的onopen/onclose/onerror都属于异步事件回调,会等待当前同步代码执行完毕后才会触发,因此函数返回时变量a还没有被赋值,自然会导致Jest断言报错。同时不要使用while循环阻塞等待状态变化,JS为单线程事件循环模型,阻塞主线程会导致所有异步回调永远无法执行,直接卡死程序。

实现方案

第一步:改造状态检测函数为异步Promise形式

将状态结果通过Promise抛出,等待异步事件触发后再结束函数执行:

function checkServerStatus(timeout = 3000) {
  return new Promise((resolve) => {
    const ws = new WebSocket('ws://127.0.0.1:8080');
    // 超时兜底,避免服务无响应时测试卡死
    const timeoutTimer = setTimeout(() => {
      ws.close();
      resolve(ws.readyState);
    }, timeout);

    ws.onopen = () => {
      clearTimeout(timeoutTimer);
      const currentState = ws.readyState;
      ws.close();
      resolve(currentState);
    };

    ws.onclose = () => {
      clearTimeout(timeoutTimer);
      resolve(ws.readyState);
    };

    ws.onerror = () => {
      clearTimeout(timeoutTimer);
      resolve(ws.readyState);
    };
  })
}

第二步:Jest异步测试写法

Jest原生支持异步测试,使用async/await等待Promise返回结果后再执行断言即可:

test('验证WebSocket服务端状态', async () => {
  const finalState = await checkServerStatus();
  // 状态只能为1(OPEN)或3(CLOSED)
  expect([1, 3]).toContain(finalState);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:54:04