我有一个通过异步调用找到的值 A 。 A 将不断变化。因此,我想执行一些操作,例如每10秒记录一次,并将 A 的值写入带有时间戳的文件中。
所以我以此为起点https://codereview.stackexchange.com/questions/141329/write-log-file-in-nodejs-with-setinterval
var fs = require('fs');
var tStamp = new Date().now;
// getA() is the a async function
async function log(){
fs.appendFile('c:/log.txt', tStamp + getA() , (err) => {
if (err) throw err;
logText = '';
});
}
setInterval(log, 5000);
虽然不起作用。该函数不会重复调用。它似乎只被调用了一次,这显然不是我所希望的。我以为可能会使用类似的
var pieceOfLog = await getA();
在上述功能内部,可能有所帮助,但没有帮助。那么在这里做什么?
我应该使用完全不同的方法吗? 我在代码中犯了一个愚蠢的错误吗? 我是否应该使用像Cron这样的库为我做这件事?
答案 0 :(得分:3)
new Date().now
是undefined
。将其更改为Date.now()
。这是一个静态函数。
确定getA()
确实是异步的吗?
除此之外...
如果您不需要精确度(例如,可以一次在10.25秒之后,然后在下一次10.12秒,等等),那么setInterval(functionThatLogs, 10000)
就可以做到。只需确保functionThatLogs
是可快速附加到文件的函数即可。
如果文件很大或正在写入的数据非常重要,则可能需要查看管道,流等。但是,有关每10秒如何记录一次的问题……这可能是最简单的解决方案。
这是您提供的对我有用的代码的简化版本。我希望它也对您有用。它会删除getA()
,因此如果此代码有效而您的代码无效,则getA()
似乎有问题。
var fs = require('fs');
var path = require('path');
async function log(){
fs.appendFile(path.join(__dirname, 'log.txt'), Date.now() + '\n', (err) => {
if (err) throw err;
logText = '';
});
}
setInterval(log, 5000);
答案 1 :(得分:1)
getA()
的签名是什么?它会返回承诺吗?
如果是,则:
async function log(){
var tStamp = new Date().now;
var a = await getA();
fs.appendFile('c:/log.txt', tStamp + a, (err) => {
if (err) throw err;
logText = '';
});
}
setInterval(log, 5000);
应该工作。 如果没有,您是否看到任何错误?
您很可能应该使用fs.appendFileSync
以避免可能的异步问题。