Чтение нескольких файлов последовательно без использования readFileSync () в Node.js - PullRequest
0 голосов
/ 06 мая 2019

Если используется метод readFileSync, я могу выполнить свою задачу в следующем коде:

// Array of the file names
const files = [
    'a.txt',
    'b.txt',
    'c.txt'
]

for (let i=0;i < files.length();i++) {
    let result = fs.readFileSync(files[i]);
    console.log(files[i] + "  " + result.length);
}

console.log('done');

Итак, если я не могу использовать метод readFileSync, как получить такой же вывод?

Я использую узел v6.10.3, поэтому у меня нет util.promisify(), но у меня есть почти полная поддержка Promise.

1 Ответ

1 голос
/ 06 мая 2019

Используя util.promisify() и fs.readFile() с Promise.all(), вы можете сделать следующее: асинхронно считывает все файлы параллельно и обеспечивает буферы в порядке, когда все операции завершены. Ниже также содержится полизаполнение для util.promisify() для версий узлов менее v8.0.0, которые поддерживают Promise и ECMAScript 6:

const fs = require('fs')
// const util = require('util')

function promisify (fn) {
  return function () {
    return new Promise((resolve, reject) => {
      fn.call(this, ...arguments, (error, value) => {
        if (error) reject(error)
        else resolve(value)
      })
    })
  }
}

const files = [
  'a.txt',
  'b.txt',
  'c.txt'
]

// const readFile = util.promisify(fs.readFile)
const readFile = promisify(fs.readFile)

Promise.all(files.map(file => readFile(file))).then(
  results => results.forEach((result, index) => {
    console.log(files[index], result.length)
  })
)

Просто для того, чтобы немного объяснить, что здесь происходит с магией util.promisify(), получается обратный вызов в стиле узла:

fs.readFile(file, (error, result) => {
  if (error) {
    // handle error
  } else {
    // handle result
  }
})

в это обещание:

util.promisify(fs.readFile)(file).then(result => {
  // handle result
}, error => {
  // handle error
})

Но вместо этого мы сохраняем ссылку на функцию, возвращаемую util.promisify(fs.readFile) в переменной readFile, чтобы ее можно было вызывать для каждого file.

...