事件处理未按预期nodejs工作



编写这个小型域搜索应用程序时,它应该按顺序搜索数组中每个项目的.com,但它一直在搜索test1。即使我在搜索函数中做了一个控制台日志,它也会告诉我x的值是test2和test3。我需要删除侦听器还是其他什么?

我得到以下输出

 domain test1.com
 Domain Name: TEST1.COM
 domain test2.com
 Domain Name: TEST1.COM
 domain test3.com
 Domain Name: TEST1.COM

app.js

 var port = 43;
 var net = require('net');
 var host = 'whois.internic.net';
 var dotCom = new net.Socket();
 var c = 0;
 var connections = 0;
 var dotComStatus;
 dotCom.setEncoding('ascii');
 var searches = ['test1', 'test2', 'test3'];
 search(searches.shift()); 
 function chkconnections(z) {
      if (connections <= 0) {
           if (searches.length >= 1) {
                process.nextTick(function() {
                     search(searches.shift());
                });
           }
      }
 }
function search(x) {
   var q = "domain " + x + ".comrn";
   dotCom.connect(port, host, function() {
        dotCom.write(q);
        console.log(q);
        connections++;
   });
   dotCom.on('data', function(data) {
        c++;
        if (c == 2) { 
             dotComStatus = data.split('n')[1];
             dotCom.on('close', function() {
                  console.log(dotComStatus);
                  connections--;
                  chkconnections();
             });
        }
   });
}   

此代码存在几个明显的问题。首先,将关闭事件放在数据事件中是个坏主意。如果连接在收到数据之前关闭,则永远无法访问该代码段。接下来是的部分出现了一个大问题

c++;
if (c == 2)

由于从未将c重置为0,因此从未执行下一行dotComStatus = data.split('n')[1];。但是随后套接字关闭并且事件closed被触发。并且这被再次执行。

  console.log(dotComStatus);
  connections--;
  chkconnections();

但由于CCD_ 5等于0,因此CCD_。有很多例子可以说明如何实现NodeJS中常见的连接/数据/端流。

 var port = 43;
  var net = require('net');
  var host = 'whois.internic.net';
  var searches = ['test1', 'test2', 'test3'];
  search(searches.shift());
  function chkconnections(z) {
    if(searches.length > 0)
      search(searches.shift());
  }
  function search(x) {
    var dotCom = new net.Socket();
    dotCom.setEncoding('ascii');
    var q = "domain " + x + ".comrn";
    dotCom.connect(port, host, function() {
      dotCom.write(q);
    });
    var data = ""; // holding place until socket closes
    dotCom.on('data', function(chunk) {
      data += chunk; // add chunk to data
    });
    dotCom.on("end", function() {
      // socket closed
      dotComStatus = data.split('n')[7]; // Should be 'Domain Name: blah'
      console.log(dotComStatus);
      chkconnections(); // move on to next
    });
};

最新更新