繁体   English   中英

WebSocket 响应 Function 执行

[英]WebSocket Response Function Execution

我有一个代码,但是它的问题是function getip()没有首先执行。 我没有在 Javascript 中编码,所以我真的不知道发生了什么。 我希望console.log('connected!')function getip()完全完成后执行。

如果可能的话,如果有人能通过一些简短的解释进行必要的更改,我将不胜感激。

(async function getip() {
    var responses = [];
    var ips = [ "IP1", "IP2" ]
    var length = ips.length
    for (var i = 0; i < length; i++) {
        (async function() {
            var ws = new WebSocket('ws://' + ips[i] + ':80');
            await new Promise(function(res) {
                var timeout = setTimeout(function() {
                                console.log("Socket connection timeout", ws.readyState);
                                console.log(ws.url);
                                if (ws.readyState == 3){
                                    responses.push('connected')
                                } else {
                                    responses.push('not connected')
                                }
                                ws.close();
                },5000);
            });
        })();
    }
})();

console.log('connected!')

发生了几件事:

getip function 是异步的,这意味着它在执行时不会阻止其他代码运行。 由于异步性质,这会导致调用console.log('connected')

您的Promise不会在任何地方调用res 这意味着 promise 永远不会解决,因此,您的await永远不会停止等待。

在 promise 的setTimeout中,您正在寻找 web 套接字实例上的readyState 目前您正在检查的是 state 是否为3 ,这意味着关闭,它(可能)不会关闭,因为您刚刚打开了 web 插座。 而是关闭连接,拒绝promise,说promise失败。

使用onopenonerror事件监控 web sockets 是否已成功打开或发生错误。 onopen function 调用resolve成功关闭promise。 onerror回调中reject promise 并将一些数据传递给它,以便您可以阅读错误日志。 在这两种情况下,清除超时。

与其await每个Promise ,不如将它们全部收集在一个数组中,然后使用Promise.all()来等待一系列承诺。 这将确保所有 web sockets 并行打开。 当一切正常时, console.log('connected')将登录到控制台。 否则,如果其中一个 Promise 产生了错误,它将记录一个错误。

这个主题很难掌握,需要一些练习才能获得点击时间。

下面的示例使用了上述所有做法。 检查它,如果有任何后续问题,请随时提出。

async function getip() {
  const ips =  ["IP1", "IP2"];
  const responses = ips.map(ip => new Promise((resolve, reject) => {
    const ws = new WebSocket(`ws://${ip}:80`);
    
    let timeout = setTimeout(() => {
      // Save the state before closing, otherwise it will always be the closed state.
      const currentState = ws.readyState;
      ws.close();
      reject({
        message: 'Socket connection timeout', 
        state: currentState
      });
    }, 5000);

    ws.onopen = () => {
      clearTimeout(timeout);
      resolve(ws);
    };

    ws.onerror = event => {
      clearTimeout(timeout);
      reject({
        message: 'Socket connection error',
        event
      });
    };
  }));

  const sockets = await Promise.all(responses);
  return sockets;
}
getip().then(sockets => {
  console.log('connected!', sockets);
}).catch(error => {
  console.log(error);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM