Решение задачи при помощи асинхронных методов fs и setTimeout в JavaScript
Первая часть задачи решена и заключалась в следующем
Сначала нужно будет получить информацию о файлах, которые лежат в папке files. В этом тебе помогут методы: fs.readdirSync(path) fs.statSync(path) А теперь для каждого файла нужно будет вызвать функцию loadFile (о том как её реализовать написано чуть ниже). После загрузки каждого файла тебе нужно будет обновлять свой progressbar. Чем больше размер файла тем больший кусок должен прибавляться к полоске прогрессбара. То есть, если у тебя есть файл размером 5Кб при общем размере всех файлов - 10 Кб, то твоя полоса загрузки после обработки такого файла должна заполниться на 50% (100% * (5Кб / 10Кб)). Теперь о том как реализовать функцию loadFile. Во-первых, тебе нужно будет прочитать файл используя метод fs.readFileSync. Однако, на современных компьютерах этот метод исполняется молниеносно. Поэтому для того чтобы увидеть как полоска прогрессбара постепенно заполняется, давай добавим искусственную задержку загрузки файла. Для этого тебе нужно будет воспользоваться синхронной версией setTimeout. Возьми её из пакета https://www.npmjs.com/package/wait-sync. Сделай таймаут пропорциональным размеру файла. Тут отталкивайся от размеров своих файлов. Например, можешь сделать так, чтобы 10 KB "загружались" 1 секунду.
Код я написал следующим образом:
const filesArr = fs.readdirSync("files", (err, data) => {
if (err) throw err;
return data;
});
function loadFiles() {
let count = [];
for (let i = 0; i < filesArr.length; i += 1) {
const size = fs.statSync(`files/${filesArr[i]}`).size;
count.push(size);
}
const countNew = count.reduce((acc, el) => acc + el, 0);
const countPercent = count.map((el) => +(el / countNew).toFixed(2));
let counter = 0;
for (let j = 0; j < countPercent.length; j += 1) {
waitSync(0.9);
counter += countPercent[j];
bar.update(counter);
console.log(count[j]);
}
}
loadFiles();
Вторая часть задачи вызвала затруднения. Условия были следующими:
Теперь тебе нужно сделать всё то же самое, но пользуясь асинхронными методами fs, а также обычным асинхронным setTimeout в функции loadFile. Получить информацию о файлах в папке files тебе помогут fs-методы: fs.readdir(path) fs.stat(path) Файлы нужно будет загружать параллельно (то есть каждый следующий вызов loadFile должен произойти не дожидаясь того пока закончит свою работу предыдущий).
Как я понимаю функция loadFile должна содержать setTimeout, как в примере ниже:
function loadFile(array, callback) {
setTimeout(() => {
callback("Тут что-то происходит с каждым элементом array");
}, 10);
}
Следующим этапом нужно получить массив, с которым можно работать. Но я не могу понять как работать fs.readdir(path) и fs.stat(path) (без Sync на конце). Асинхронные функции ничего не возвращают мне. То есть вариант
const filesArr = fs.readdir("files", (err, data) => {
if (err) throw err;
return data;
});
возвратит мне undefined. Хочу разобраться, как в этом решении применить вместе setTimeout и асинхронные fs?