javascript - Node.js 超时未触发

标签 javascript node.js settimeout x-ray

我正在使用x-ray用于抓取特定网站的某些内容并将其保存在 JSON 文件中的库。

我想每小时获取一次状态,但 Node 不执行我的 setTimeout

这是我的代码:

var db, record, x;
x = require('x-ray')();
db = require('lowdb')('rec.json', {
  storage: require('lowdb/file-async')
});

record = function() {
  console.log('will contact server');
  setTimeout(record, 60 * 60 * 1000);
  x('http://example.com', 'h1')(function(err, content) {
    console.log('server contacted');
    if (err) {
      console.log('error occurred');
      db('status').push({
        time: (new Date).toString(),
        status: err
      });
    } else {
      console.log('status recorded successfully');
      db('status').push({
        time: (new Date).toString(),
        status: content
      });
    }
  });
};
console.log('ready');

record();

第一次记录时没有任何问题,但之后就什么也不做。看来 record 函数只执行一次。

我使用 pm2 来管理进程,pm2 list 显示它的运行时间远远超过 60 分钟。即使 Node 无法在给定时间内准确执行回调,该进程仍处于事件状态(最长,在我重新启动之前)大约 80 分钟。

日志中没有错误,并且在我的测试过程中没有意外重启。

也许这与我使用的库有关?我不知道是什么原因造成的。

最佳答案

来自LowDB Docs :

Important

When you modify the database, a Promise is returned.

When you read from the database, the result is immediately returned.

then 回调中安排函数执行应该可以:

var db, record, x;
x = require('x-ray')();
db = require('lowdb')('rec.json', {
  storage: require('lowdb/file-async')
});

record = function() {
  console.log('will contact server');
  x('http://example.com', 'h1')(function(err, content) {
    console.log('server contacted');
    if (err) {
      console.log('error occurred');
      db('status').push({
        time: (new Date).toString(),
        status: err
      }).then(function(status) {
        setTimeout(record, 60 * 60 * 1000);
      });
    } else {
      console.log('status recorded successfully');
      db('status').push({
        time: (new Date).toString(),
        status: content
      }).then(function(status) {
        setTimeout(record, 60 * 60 * 1000);
      });
    }
  });
};
console.log('ready');

record();

关于javascript - Node.js 超时未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809052/

相关文章:

javascript - 使用 Add-on SDK 在 Firefox 中访问 navigator.plugins

javascript - 前几次浏览器执行 setTimeout() 的时间不到 4 毫秒

javascript - 如何在location.back之后重新加载上一页中的当前页面(不是SPA)

javascript - 使用 JQuery 更改背景

javascript - 进入 Mobile Safari 后返回 iPad Webapp

javascript - 在 Ember.js 中预设复选框的最佳方法是什么?

javascript - 从javascript返回true然后表单继续提交

javascript - 进程运行了多长时间(使用 Node)?

node.js - 如何在 vs-code 中调试安装在 bot (botpress) 中的 botpress 模块?

node.js - 如何动态设置 Jade 模板的布局以在 Node.js/Express 3.0 中扩展?