首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >nodejs计时器不工作

nodejs计时器不工作
EN

Stack Overflow用户
提问于 2016-10-28 04:25:30
回答 1查看 347关注 0票数 1
代码语言:javascript
复制
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秒内递增,有时在2秒内递增,有时在3秒内递增,等等。比如1-1秒延迟,2-1秒延迟,3-2秒延迟,4-3秒延迟。我的代码出了什么问题?

EN

回答 1

Stack Overflow用户

发布于 2016-10-28 04:42:54

因为它是异步的,所以你必须控制进程何时结束等等。

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

代码语言:javascript
复制
var sequelize = new Sequelize('connection string');

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

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

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

因此,只需执行以下操作:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40293631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档