2011-08-11 30 views
3

我正在研究一个函数,该函数遍历一个端口列表,并在其中一个端口可用时调用其回调函数。不用等待每个端口响应,我想在所有端口上调用checkPortStatus函数,并在第一个端口恢复可用时返回。有条件地在for循环中执行异步函数调用中的回调

这里的示例代码可运行在Node.js的:

AVAILABLE PORT: 3005 
AVAILABLE PORT: 3007 
AVAILABLE PORT: 3006 

两个问题:

  1. 如何调用回调只有一次

    // Check if a port is open (in use) or closed (available) 
        function checkPortStatus(port, callback) { 
         // Simulates real world checking of response from port by returning 
         // after a random time. 
         setTimeout(function() { 
         // Simulates a few closed ports 
         if (port === 3005 || port === 3006 || port === 3007) { 
          callback('closed') 
         } 
         // Simulates a few open ports 
         else { 
          callback('open') 
         } 
         }, Math.floor(Math.random() * 200)) 
        } 
    
        // Calls callback once any available port is found 
        function findAnAvailablePort(startPort, endPort, callback) { 
         var check = function(port) { 
         checkPortStatus(port, function(status) { 
          // If a port is 'closed', it's considered available 
          if (status === 'closed') { 
          callback(port) 
          } 
         }) 
         } 
         for (var port = startPort; port <= endPort; port++) { 
         check(port) 
         } 
        } 
    
        findAnAvailablePort(3000, 3010, function(port) { 
         console.log('AVAILABLE PORT: ' + port) 
        }); 
    
        // Don't exit Node, wait for a response 
        setTimeout(function() { console.log('FIN') }, 5000) 
    

    运行代码的结果?我只想要匹配的第一个端口返回。

  2. 如何检查是否返回所有函数回调?在这个例子中,当所有checkPortStatus返回端口都不可用时,我需要返回。

回答

1

初始化功能之外的几个变量应该做的伎俩:

// Calls callback once any available port is found 
var hasFoundPort = false; 
var checkedPorts = 0; 
function findAnAvailablePort(startPort, endPort, callback) { 
    var check = function(port) { 
    checkPortStatus(port, function(status) { 
     checkedPorts++; 
     // If a port is 'closed', it's considered available 
     if (status === 'closed' && !hasFoundPort) { // only execute callback once 
     callback(port) 
     hasFoundPort = true; 
     } 
     if(checkedPorts == endPort - startPort + 1) // checked all ports 
      console.log('finished checking'); 
    }) 
    } 
    for (var port = startPort; port <= endPort; port++) { 
    check(port) 
    } 
} 
+0

您还应该关闭其他端口,当端口已经找到。 – TiansHUo

+0

谢谢大卫,我过度思考问题。您的解决方案奏效代码可以在这里找到:https://github.com/baalexander/node-portscanner – baalexander