Используя 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
.