Введение
В этом проекте вы научитесь превращать асинхронную функцию с обратными вызовами в JavaScript в функцию, основанную на промисах. В частности, вы преобразуете функцию readFile с обратными вызовами из модуля fs в Node.js в версию, основанную на промисах.
🎯 Задачи
В этом проекте вы научитесь:
- Определять условия для превращения функции в функцию, основанную на промисах
- Реализовывать функцию
promisefy, которая оборачивает функцию с обратными вызовами и возвращает промис - Использовать версию функции
readFile, основанную на промисах, для асинхронного чтения файла
🏆 Достижения
После завершения этого проекта вы сможете:
- Разобраться в преимуществах использования промисов по сравнению с асинхронным программированием с обратными вызовами
- Реализовать обобщенную функцию
promisefyдля преобразования функций с обратными вызовами в функции, основанные на промисах - Использовать асинхронные функции, основанные на промисах, в своих проектах для улучшения читаемости кода и обработки ошибок
Преобразовать функцию readFile в функцию, основанную на промисах
В этом шаге вы научитесь превращать функцию readFile из модуля fs в Node.js в функцию, основанную на промисах. Следуйте шагам ниже, чтобы выполнить этот шаг:
- Откройте файл
index.jsв вашем редакторе кода. - Импортируйте необходимые модули в начале файла:
const fs = require("fs");
const path = require("path");
- Определите путь к файлу
test-promisefy.json:
const textPath = path.join(__dirname, "/test-promisefy.json");
- Реализуйте функцию
promisefy:
const promisefy = (fn) => {
return (textPath, type) => {
return new Promise((resolve, reject) => {
fn(textPath, type, (err, contrast) => {
if (err) {
reject(err);
} else {
resolve(contrast);
}
});
});
};
};
Функция promisefy принимает в качестве аргумента функцию fn с обратными вызовами и возвращает новую функцию, которая возвращает промис. Возвращенная функция вызывает исходную функцию fn и либо разрешает промис результатом, либо отклоняет его с ошибкой.
- Используйте функцию
promisefy, чтобы создать версию функцииreadFile, основанную на промисах:
const readFileSync = promisefy(fs.readFile);
Теперь вы можете использовать функцию readFileSync для асинхронного чтения файла test-promisefy.json с использованием промисов.
Прочитать файл с использованием функции readFile, основанной на промисах
В этом шаге вы научитесь использовать функцию readFileSync, основанную на промисах, для чтения файла test-promisefy.json.
- Добавьте следующий код в файл
index.js:
fs.readFile(textPath, "utf8", (err, contrast) => {
const readFileSync = promisefy(fs.readFile);
readFileSync(textPath, "utf8")
.then((res) => {
console.log(res === contrast); // Здесь ожидается результат: true, то есть промис возвращает ту же содержимое, что и предыдущее чтение.
})
.catch((err) => {});
});
Этот код вызывает функцию readFileSync с путём к файлу и кодировкой, а затем обрабатывает разрешение и отклонение промиса с использованием методов then и catch.
- Теперь ваш файл
index.jsдолжен выглядеть так:
const fs = require("fs");
const path = require("path");
const textPath = path.join(__dirname, "/test-promisefy.json");
fs.readFile(textPath, "utf8", (err, contrast) => {
const readFileSync = promisefy(fs.readFile);
readFileSync(textPath, "utf8")
.then((res) => {
console.log(res === contrast); // Здесь ожидается результат: true, то есть промис возвращает ту же содержимое, что и предыдущее чтение.
})
.catch((err) => {});
});
const promisefy = (fn) => {
return (textPath, type) => {
return new Promise((resolve, reject) => {
fn(textPath, type, (err, contrast) => {
if (err) {
reject(err);
} else {
resolve(contrast);
}
});
});
};
};
module.exports = promisefy;
- Запустите файл
index.jsв терминале:
node index
Вы должны увидеть вывод true, что означает, что функция readFile, основанная на промисах, вернула то же самое содержимое, что и исходная функция readFile с обратными вызовами.
Поздравляем! Вы успешно преобразовали функцию readFile в функцию, основанную на промисах, и использовали версию, основанную на промисах, для чтения файла.
Резюме
Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.



