在终止功能之前等待 websocket 连接

Wait for websocket to connect before terminating function

我正在使用 Jest 来测试我的服务器状态,并且我一直在尝试使用 setTimeout、延迟和 while 循环来检查 readyState 是否从 0 - CONNECTING 更改为 3 - CLOSED 或 1 - OPEN。只有一个问题,那就是我尝试使用事件侦听器,但由于在函数终止后在这种情况下稍后执行或从不执行,Jest 提供了一个错误

我尝试过像这些不同的功能

function checkServerStatus() {
    const ws = new WebSocket('ws://127.0.0.1:8080');
    let a;
    ws.onopen = () => {
        a = ws.readyState;
        ws.close();
    }
    return a;
}

Javascript 无法按照您要求的方式工作。 ws.onopen() 是一个非阻塞事件处理程序。您只是分配了一个将在将来某个时间调用的函数,并且没有办法让 checkServerStatus() 等待在函数 return 之前调用该函数。这就是在 Javascript.

中进行联网的非阻塞、事件驱动的特性

相反,您需要根据事件驱动编程来设计您的逻辑。在这种情况下,你必须让你的函数 return 当它自然 return 时,然后你需要在你有你想要的值时通知调用者。您可以使用回调函数、事件或承诺来通知他们。

由于 promises 是在 Javascript 中进行异步通知的现代方式,下面是一个使用 promise 的示例:

function checkServerStatus() {
    return new Promise((resolve, reject) => {
        const ws = new WebSocket('ws://127.0.0.1:8080');
        ws.onopen = () => {
            resolve(ws.readyState);
            ws.close();
        };
        ws.onerror = (e) => {
            reject(e);
        };
    });
}

然后您可以像这样调用此函数:

checkServerStatus().then(val => {
   console.log(val);
}).catch(err => {
   console.log(err);
});