I can suggest you to rewrite the code to promise - it will make much easy to deal with it
const {promisisfy} = require('util')
const fs = require('fs')
const readFile = promisify(fs.readFile)
const fileNames = getFilenamesSomehow() // <-- returns array with path, e.g. ["./package.json", "/etc/hosts", "/etc/passwd"]
Promise.all(fileNames.map(name => readFile(name)))
.then(arrayWithFilesContent => analyze(arrayWithFilesContent))
.catch(err => handleError(err))
Next step what you may do - move the code to async/await functions
UPD
Assume you need read only one file, then parse it data to json and analyze the result somehow.
It this case you can do next:
readFile(singleFileName)
.then(function (singleFileContent) {
return JSON.parse(singleFileContent)
})
.then(function (singleFileContentInJson) {
return analyze(singleFileContentInJson)
})
.catch(funciton (error) {
//here you can process all errors from functions above: reading file error, JSON.parse error, analyze error...
console.log(error)
})
Then assume you need to analyze bunch of files
const fileNames = [...] // array with file names
// this create an array of promises, each of them read one file and returns the file content in JSON
const promises = fileNames.map(function (singleFileName) {
return readFile(singleFileName)
.then(function (singleFileContent) {
return JSON.parse(singleFileContent)
})
})
// promise all resolves (calls callback in 'then') all of promises in array are resolved and pass to then callback array with result of each promise
Promise.all(promises)
.then(function (arrayWithResults) {
return analyze(arrayWithResults)
})
// catch callback calls if one of promises in array rejects with error from the promise - so you can handle e.g. read file error or json parsing error here
.catch(function (error) {
//here you can handle any error
console.log(error)
})
Try to google some article to read how does promises work.
E. g. you can start form mdn article