2013-07-27 2 views
0

, записывая это небольшое приложение поиска домена, он должен последовательно искать .com каждого элемента в массиве, но он продолжает поиск test1. даже если я делаю консольный журнал в функции поиска, он говорит мне, что значение x является test2, а тест 3. мне нужно удалить слушателя или что-то еще?Обработка событий не работает как ожидалось nodejs

я получаю следующие выходные данные

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 + ".com\r\n"; 

    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(); 
      }); 
     } 
    }); 
} 

ответ

1

Есть несколько очевидных проблем с этим кодом. Во-первых, закрытие события в событии данных - плохая идея. Если соединение было закрыто до получения данных, что раздел кода никогда не будет достигнут. Далее есть большая проблема с секцией с

c++; 
if (c == 2) 

Поскольку вы никогда не сбросить c до 0 следующей строки dotComStatus = data.split('\n')[1]; никогда не выполняются. Но затем сокет закрывается и запускается событие closed. И это выполняется снова.

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

Но ценность dotComStatus не изменилась с c была равна 0. Есть много примеров того, как сделать это подключить/данные/завершения потока, который является общим в 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 + ".com\r\n"; 

    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 
    }); 
}; 
Смежные вопросы