title: Conditionally executing a callback within an asynchronous function call in a for loop
body: <p>I'm working on a function that iterates through a list of ports and calls its callback once one of the ports is available. Instead of waiting for each port response, I'd like to call a checkPortStatus function on all the ports and return when the first port returns as available.</p>
  
  <p>Here's sample code runnable in node.js:</p>
  
  <pre><code>    // 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 &lt;= 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)
  </code></pre>
  
  <p>Results of running the code:</p>
  
  <pre><code>AVAILABLE PORT: 3005
  AVAILABLE PORT: 3007
  AVAILABLE PORT: 3006
  </code></pre>
  
  <p>Two questions:</p>
  
  <ol>
  <li>How do I call the callback only once? I want only the first port that matches to return. </li>
  <li>How do I check if all function callbacks returned? In this example, I need to return when all checkPortStatus return ports as unavailable.</li>
  </ol>