node.js 超时未触发
node.js timeout not firing
我正在使用 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();
虽然不是一个确切的解决方案,但我将其作为答案发布,因为它解决了这个问题,同时也关闭了这个问题。
最终,我使用 cron
解决了这个问题。
我正在使用 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();
虽然不是一个确切的解决方案,但我将其作为答案发布,因为它解决了这个问题,同时也关闭了这个问题。
最终,我使用 cron
解决了这个问题。