在终止功能之前等待 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);
});
我正在使用 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);
});