3
我正在研究一个函数,该函数遍历一个端口列表,并在其中一个端口可用时调用其回调函数。不用等待每个端口响应,我想在所有端口上调用checkPortStatus函数,并在第一个端口恢复可用时返回。有条件地在for循环中执行异步函数调用中的回调
这里的示例代码可运行在Node.js的:
AVAILABLE PORT: 3005
AVAILABLE PORT: 3007
AVAILABLE PORT: 3006
两个问题:
- 如何调用回调只有一次
// 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)
运行代码的结果?我只想要匹配的第一个端口返回。
- 如何检查是否返回所有函数回调?在这个例子中,当所有checkPortStatus返回端口都不可用时,我需要返回。
您还应该关闭其他端口,当端口已经找到。 – TiansHUo
谢谢大卫,我过度思考问题。您的解决方案奏效代码可以在这里找到:https://github.com/baalexander/node-portscanner – baalexander