异步读取文件时解析 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

java怎么将json文件读取进来并转成map

使用机器人框架读取 json 文件时出现问题

flutter上没有互联网连接时如何读取本地文件?