javascript - Nodejs计时器不工作

标签 javascript node.js timer socket.io

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 秒延迟。我的代码有什么问题吗?

最佳答案

由于它是异步的,您必须控制进程何时完成等。

当您执行以下操作时,Sequelize 会自动连接到数据库:

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

authenticate 只是简单地SELECT 1+1 AS result 来检查 promise 中返回的连接是否正常。

因此,promise 的结果将是 err - 这将表明连接出现问题。

去同步的问题可能是网络、数据库性能/业务和许多其他因素。为了避免这种情况,您需要控制日程安排。

所以只需这样做:

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

关于javascript - Nodejs计时器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40293631/

相关文章:

javascript - 可以滚动到 div 内的下一个元素吗?

javascript - 在没有 Node.js 和 CDN 的网页中包含 Chart.js

python - 如何在 python 中设置以特定间隔重复的循环?

javascript - Chrome 中的 adrns.js 注入(inject)

javascript - 在升级事件中异步更新 IndexedDB

javascript - JsTree 多树cookie

javascript - Node.js Jasmine 测试

node.js - 带有 REST API 的 CQRS

c++ - 将定时器添加到 qt 应用程序

ios - dispatch_source_t 处理函数的计时问题——我是否遵循正确的调度计时器模式?