异步读取文件时解析 JSON
Posted
技术标签:
【中文标题】异步读取文件时解析 JSON【英文标题】:Parse JSON while asynchronously reading files 【发布时间】:2016-06-04 13:34:24 【问题描述】:我正在尝试读取一些 JSON 文件并将它们的结果存储到一个数组中。我有:
const files = ['file0.json', 'file1.json', 'file2.json', 'file3.json']
为了读取所有文件并创建文件内容的结果数组,我这样做:
import readFile from 'fs'
import async from 'async'
const files = ['file0.json', 'file1.json', 'file2.json', 'file3.json']
function read(file, callback)
readFile(file, 'utf8', callback)
async.map(files, read, (err, results) =>
if (err) throw err
// parse without needing to map over entire results array?
results = results.map(file => JSON.parse(file))
console.log('results', results)
)
这篇文章帮助我到达那里:Asynchronously reading and caching multiple files in nodejs
我想知道的是如何在读取文件的中间步骤中调用JSON.parse()
,而不是在结果数组上调用map
。我想澄清一下 read 函数中的 callback
参数到底是做什么用的,如果不是为了正确调用 readFile
而传入的话。
【问题讨论】:
你能做类似readFile(file, 'utf8').then(JSON.parse).then(callback)
的事情吗?
@dandavis 让我们不要用承诺侮辱 ts ;)
【参考方案1】:
好吧,也许你应该在读取步骤中移动JSON.parse
import readFile from 'fs'
import async from 'async'
const files = ['file0.json', 'file1.json', 'file2.json', 'file3.json']
function read(file, callback)
readFile(file, 'utf8', function(err, data)
if (err)
return callback(err);
try
callback(JSON.parse(data));
catch (rejection)
return callback(rejection);
)
async.map(files, read, (err, results) =>
if (err) throw err;
console.log('results', results)
)
我建议你阅读this article以了解回调函数的含义。
【讨论】:
这确实解析了 JSON,但有几个问题。实际结果最终在async.map
的回调中的参数err
中,而result
参数未定义。此外,只有第一个文件以 results
结尾。如果我在try
中添加console.log(JSON.parse(data))
,它会在打印第一个文件的内容后从async.map
打印results
,然后打印剩余文件的内容。以上是关于异步读取文件时解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章
javascript 与nodejs core lib异步读取json文件
找不到“object”类型的不同支持对象“[object Object]”。仅支持在从 JSON 文件读取和解析数据时绑定到 Iterables