【发布时间】:2021-11-26 02:11:56
【问题描述】:
如果我有由 API 调用的异步函数,该函数会检查日志文件 current.log 的大小,如果超出限制,则应将其复制到 old.log 文件并删除 current.log 文件的内容之后。
function checkSizeCopyAndDelete(){
if(size>1024){
//delete old file contents
fs.truncate(oldLogFile,()=>{
//copy current file contents to the old file
fs.copyFile(currentLogFile, oldLogFile, ()=>{
//then delete the currentLogFile that was copied to the oldLogFile
fs.truncate(currentLogFile ,()=>{
//done, now we should add the new data to be logged to currentLogFile
})
})
})
}
}
如果我使用fs.copyFile 而不是fs.copyFileSync,
如何处理事件循环基于checkSizeCopyAndDelete 找到两个不同的截断函数调用的场景 1024+,
然后执行 1 个截断调用并删除文件,然后甚至在第二个之前截断它确实复制了文件。
现在第二个截断仍然会被执行(并删除刚刚填充的新old.log文件),因为它不知道current.log文件大小变成了0,然后复制,留下old.log文件包含新的 current.log 文件的内容,而不是包含应该存在但被删除的 1024+ KB 数据。
在这种情况下我必须使用同步版本吗?
【问题讨论】:
-
在哪种情况下,API 会多次调用以同时完成特定工作?如果您使用的是 HTTP API,为什么要这样做? cron 工作不适合吗?在任何情况下,如果您在启动时阻止新操作会更好。
标签: node.js asynchronous logging fs