2015-07-10 200 views
4

使用Node.js的,我設置一個計時器連接的TCP server.when它的成功,這將是cleared.However不work.just這樣的:爲什麼我的clearInterval不起作用?

var net = require('net'); 
var connectTransferTick=null; 

var client ; 
client = new net.Socket(); 
function clientConnect() { 
    client.connect(8009, '127.0.0.1', function() { 
     console.log('success,clear timer'); 
     if(connectTransferTick!=null); 
     { 
      clearInterval(connectTransferTick); 
     } 
    }); 
    client.on('error',function() 
    {}); 
    client.on('close', function() { 
     console.log('The server had been closed,Try to connect it again later'); 
     if(connectTransferTick!=null) 
     { 
      console.log(clearInterval(connectTransferTick)); 
     } 
     connectTransferTick = setInterval(clientConnect,1000); 
    }); 
} 
clientConnect(); 

運行它,你會發現定時器不能清除。

同時,我只要把函數clientConnect(此代碼),就像這樣:

function clientConnect() { 
    client = new net.Socket(); 

定時器可以cleared.I不能explaint。爲什麼?請幫助我。謝謝很多。

回答

0

我認爲是因爲setInterval在Socket連接關閉時被調用,但是當Socket第一次打開時,你試圖取消先前的時間間隔。

因此,當你調用

clearInterval(connectTransferTick) 

在這一點上connectTransferTick仍然null,因爲

connectTransferTick = setInterval() 

還沒有發生。

0

因爲當close被滿足時,它將導致至少再次調用clientConnect,並向客戶端註冊另一個onclose。所以每次收盤時,您只需註冊更多setInterval,而您只能清除最新的。

所以

function clientConnect() { 
    client = new net.Socket(); 

作品,因爲你創建一個新的套接字,並沒有定義onclose處理器還,所以它不會執行不止一次setInterval更多。

所以,你應該用一個標誌,以防止註冊的事件多次:

var net = require('net'); 
var connectTransferTick=null; 

var client ; 
client = new net.Socket(); 
function clientConnect(isInited) { 
    client.connect(8009, '127.0.0.1', function() { 
     console.log('success,clear timer'); 
     if(connectTransferTick!=null); 
     { 
      clearInterval(connectTransferTick); 
     } 
    }); 

    // Prevent events registered many times. 
    if (!isInited) { 
     client.on('error',function(){}); 
     client.on('close', function() { 
      console.log('The server had been closed,Try to connect it again later'); 
      if(connectTransferTick!=null) 
      { 
       console.log(clearInterval(connectTransferTick)); 
      } 
      // Pass a flag to the clientConnect 
      connectTransferTick = setInterval(clientConnect,1000, true); 
     });  
    } 

} 
clientConnect(); 

另外,我覺得setTimeout應該足夠來處理呢?

var net = require('net'); 

var client ; 
client = new net.Socket(); 
function clientConnect(isInited) { 
    client.connect(8009, '127.0.0.1', function() { 
     console.log('success,clear timer'); 
    }); 

    // Prevent events registered many times. 
    if (!isInited) { 
     client.on('error',function(){}); 
     client.on('close', function() { 
      console.log('The server had been closed,Try to connect it again later'); 
      connectTransferTick = setTimeout(clientConnect,1000, true); 
     });  
    } 

} 
clientConnect(); 
0

在使用區間的標識符的一些信息/建議:

的Node.js:

setInterval()的返回值是一個對象,它包含所有的關於間隔的信息你創建。即使在將對象作爲參數調用clearInterval()之後,對象也不會設置爲null。您應檢查對象的_repeat標誌以檢查間隔是否正在運行。

var interval_id = setInterval(function() { }, 10000); 

if (interval_id._repeat) 
{ 
    clearInterval(interval_id); 
} 

客戶端JavaScript:

setInterval()的返回值是一個int,這是所創建的間隔的id。當您致電clearInterval()時,它不會取消存儲此整數ID的變量。你應該在調用clearInterval()後手動執行此操作,如果你打算將它用作間隔是否運行的標誌。

var interval_id = setInterval(function() { }, 10000); 

if (interval_id) 
{ 
    clearInterval(interval_id); 
    interval_id = null; 
} 
+0

作爲OP對node.js的代碼,的setInterval的返回是一個'Object',請參見[#的NodeJS定時器](https://nodejs.org/api/timers.html#timers_settimeout_callback_delay_arg ) – fuyushimoya

+0

謝謝你,@fuyushimoya!我沒有意識到它與客戶端的JavaScript實現有什麼不同。經過短暫的測試驗證,我已經修改了我的答案。 – Matt