2013-07-27 30 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(); 

但由於c是等於0有如何執行這個連接/數據/結束流是共同的NodeJS中許多實例的dotComStatus值沒有改變。

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