如何在Node.js中同步检查TCP连接?

时间:2018-09-17 19:47:51

标签: node.js

应用程序需要一致检查是否有多个服务器可用。我希望定期在后台执行此操作,只要我需要知道连接状态时,只需检查上一次检查的状态即可。能够像使用其他语言一样同步使用套接字将很有帮助,这样我的定期异步函数就不会运行自己的异步函数,并且因为就我而言,任何成功的服务器都足以胜任。成功状态。不应再检查其他任务,也不应仅因为其中一个异步任务不好而将其他状态设置为坏。

当前异步情况

function checkServersPeriodically() {
    var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}];
    for (var i = 0; i < servers.length; i++) {
        someAyncFunction(servers[i].host, servers[i].port, (err) => {
             //could have two async checks with different outcomes
             if (err) bad();
             else good();
        });
    }
}

我在寻找什么(类似于如果我要使用某种文件系统检查,我只会使用fs.readSync)

 function checkServersPeriodically() {
    var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}];
    for (var i = 0; i < servers.length; i++) {
        try {
            someSyncFunction(servers[i].host, servers[i].port);
            good();
            return; // Skips the other checks
        } 
     }
     bad();
 }

1 个答案:

答案 0 :(得分:1)

这可以通过async..await方便地处理,该const { promisify } = require('util'); const somePromiseFunction = promisify(someAyncFunction); async function checkServersPeriodically() { var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}]; for (var i = 0; i < servers.length; i++) { try { await somePromiseFunction(servers[i].host, servers[i].port); good(); return; // Skips the other checks } catch (err) {} } bad(); } 为承诺提供类似同步的控制流:

checkServersPeriodically

good返回一个承诺。像async function checkServersPeriodically() { var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}]; for (var i = 0; i < servers.length; i++) { try { await somePromiseFunction(servers[i].host, servers[i].port); return; // Skips the other checks } catch (err) {} } throw new Error('no servers'); } checkServersPeriodically().then(good, bad); 和bad`这样的回调有可能是基于回调的API的残余,应该在调用者函数中处理成功或失败:

<c:url var="url" value="https://${myHost}/${myEncodedString}">
  <c:param name="code" value="123"/>
</c:url>