【发布时间】:2021-03-13 19:09:05
【问题描述】:
我有一个 .txt 文件,我想将它保存在一个 JS 数组中,然后是 console.log 那个数组。我从this answer 知道如何将文件读入数组,但问题是当我尝试console.log 数组时,它会将其记录为空。这是我的代码:
const fs = require('fs')
let arr = []
let fileReader = async () => {
await fs.readFile('temp.txt', (err, data) => {
if (err) throw err;
console.log(data.toString()); // confirming that line is successfully read
arr.push(data.toString());
})
console.log(arr)
}
fileReader()
我认为console.log 会等到数组在fs.readFile() 中完成填充,因此它会打印填充的数组。请注意,我在读取每一行时都console.log,以确认文本确实被推送到数组中。
有谁知道为什么这种方法行不通,或者我可以如何以不同的方式做到这一点?我现在想坚持使用异步 readFile 而不是同步 readFileSync。请注意,如果我确实想要同步进行,则此代码有效:
const fs = require('fs')
let arr = fs.readFileSync("temp.txt").toString('utf-8').split("\n")
console.log(arr)
【问题讨论】:
-
这是一个相当广泛的问题。您是否进行了任何调试以查看其失败的位置?您可以使用断点而不是控制台日志来消除时间模糊。
-
@isherwood 我确实使用断点来确认文本行已被成功读取并推送到数组。我还在每行被读取时 console.logged 。我已经更新了原始问题以显示这一点。感谢您指出这一点。
-
fs.readFile立即返回。异步逻辑是通过传递回调提供的,因此console.log(arr)行应该放在回调本身内。另一种方法是将readFile函数转换为真正的async函数,例如承诺它。 -
@MarcoLuzzara 明白了。你想回复我这样我可以接受吗?
-
没错。只是一个建议:始终确保等待的方法实际上返回
Promise。如果没有,await操作符就没用了,最好省略它,以免混淆阅读您的代码的人。一个简单的经验法则是:callback 和 Promises 通常无法相处,但如果带有Promise的 async/await 版本可用,那就去吧。
标签: javascript arrays asynchronous async-await asynchronous-javascript