2016-10-27 13 views
1
count=0; 

    setInterval(function(){ 
    sequelize 
     .authenticate() 
     .then(function() { 
     count = count +1; 
     console.log(count.toString()); 
     socket.emit("cloud_database_status", "online"); 
     }, function() { 
     socket.emit("cloud_database_status", "offline"); 
    }); 
    },2000); 

node.jsファイルにこのコードセットがあります。コンソールタイマーを実行すると、時々正しく動作しません。最初にコードを実行したとき、2秒ごとにカウント1をインクリメントしました。私が停止して再び走ったとき、ランダムな時間に1秒間に数回、2秒間に何回か、3秒間に何回か増やし始めました。 1 --- 1秒遅れ、2 ---- 1秒遅れ、3 ---- 2秒遅れ、4 --- 3秒遅れのように。私のコードで何が間違っていますか?nodejsタイマーが動作しない

答えて

0

それは非同期だのなので、それが終了しますと、あなたがきたプロセス上のコントロールを持っているとなど

Sequelizeが自動的にあなたが行うとき、DBに接続します。

var sequelize = new Sequelize('connection string'); 

authenticateがチェックするために、単純SELECT 1+1 AS resultを行いますそれは約束を返す接続で大丈夫です。

その結果、約束はerrになります。これは接続に何か問題があることを示します。

de-synchronizationの問題は、ネットワーク、データベースのパフォーマンス/ビジネス、その他多くの要因になります。これを回避するには、スケジューリングを制御する必要があります。

だから、単純に次の操作を行います。

var async = require('async'); // npm i --save async 

// creating custom object in sequelize object to track connection 
sequelize.databaseConnectionStatus = { 
    connected: true, 
    status: 'online', 
    lastError: '' 
}; 
async 
    .forever(function(next) { 
    sequelize 
     .authenticate() 
     .then(function(err) { 
     sequelize.databaseConnectionStatus.connected = (err) ? false : true; 
     sequelize.databaseConnectionStatus.status = (err) ? 'offline' : 'online'; 
     sequelize.databaseConnectionStatus.lastError = err; 
     if(err) console.error(err); 

     setTimeout(next, 5000); // running check every 5 seconds 
     }); 
    }); 

var count=0; 
setInterval(function() { // independent loop to read connection status and emit by socket 
    count++; 
    socket.emit("cloud_database_status", sequelize.databaseConnectionStatus.status); 
}, 2000); 
関連する問題