С методами модуля fs
асинхронно можно
работать не только через коллбэки, но и через
промисы. Для этого есть специальное свойство
promises
, содержащее в себе промисные
аналоги методов для работы с файловой системой.
К примеру, для метода fs.readFile
его промисный аналог будет fs.promises.readFile
.
Чтение файлов
Давайте выведем в консоль содержимое какого-нибудь файла:
fs.promises.readFile('readme.txt', 'utf8').then(data => {
console.log(data);
});
Пусть в файле записано число. Прочитайте этот файл и выведите в консоль сумму цифр этого числа.
Обработка исключений
Добавим теперь обработку исключительных ситуаций:
fs.promises.readFile('readme.txt', 'utf8').then(data => {
console.log(data);
}).catch(err => {
console.log('ошибка');
});
Попробуйте прочитать несуществующий файл. Убедитесь, что при этом произойдет исключительная ситуация. Допишите ваш код так, чтобы он обрабатывал эту ситуацию.
Чтение и запись
Можно прочитать файл, что-то сделать с его текстом, а потом записать обратно:
fs.promises.readFile('readme.txt', 'utf8').then(data => {
return fs.promises.writeFile('readme.txt', data + '!');
}).catch(err => {
console.log('ошибка');
});
Пусть в файле через запятую записаны числа. Сделайте скрипт, который запишет каждое из этих чисел в отдельный файл.
Массовая работа
Пусть у нас есть несколько файлов. Давайте прочитаем эти файлы, сольем их текст в одну строку и запишем ее в новый файл.
В отличие от коллбэков, в данном случае нам
нет нужды выполнять чтение файлов по очереди.
При работе с промисами мы можем записать
все промисы для чтения файлов в массив, а
потом воспользоваться Promise.all
,
чтобы осуществить запись в файл только тогда,
когда все файлы будут прочитаны.
Давайте сделаем это. Пусть имена файлов у нас есть в виде массива:
let names = ['1.txt', '2.txt', '3.txt'];
Запустим цикл, в котором будем читать файлы, записывая промисы с результатами в массив:
let names = ['1.txt', '2.txt', '3.txt'];
let files = [];
for (let name of names) {
files.push(fs.promises.readFile(name, 'utf8'));
}
console.log(files); // массив промисов
Имея такой массив, мы можем вызвать then
только один раз, когда все промисы выполнятся:
Promise.all(files).then(data => {
fs.promises.writeFile('res.txt', data.join(''));
});
Добавим обработку исключительных ситуаций:
Promise.all(files).then(data => {
fs.promises.writeFile('res.txt', data.join(''));
}).catch(err => {
console.log('что-то пошло не так');
});
Соберем весь наш код вместе:
let names = ['1.txt', '2.txt', '3.txt'];
let files = [];
for (let name of names) {
files.push(fs.promises.readFile(name, 'utf8'));
}
Promise.all(files).then(data => {
fs.promises.writeFile('res.txt', data.join(''));
}).catch(err => {
console.log('что-то пошло не так');
});
Пусть у вас есть 5
файлов с числами.
Найдите сумму этих чисел и запишите в новый файл.