Преобразование асинхронных функций с обратными вызовами в функции, основанные на промисах

JavaScriptJavaScriptBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь превращать асинхронную функцию с обратными вызовами в JavaScript в функцию, основанную на промисах. В частности, вы преобразуете функцию readFile с обратными вызовами из модуля fs в Node.js в версию, основанную на промисах.

🎯 Задачи

В этом проекте вы научитесь:

  • Определять условия для превращения функции в функцию, основанную на промисах
  • Реализовывать функцию promisefy, которая оборачивает функцию с обратными вызовами и возвращает промис
  • Использовать версию функции readFile, основанную на промисах, для асинхронного чтения файла

🏆 Достижения

После завершения этого проекта вы сможете:

  • Разобраться в преимуществах использования промисов по сравнению с асинхронным программированием с обратными вызовами
  • Реализовать обобщенную функцию promisefy для преобразования функций с обратными вызовами в функции, основанные на промисах
  • Использовать асинхронные функции, основанные на промисах, в своих проектах для улучшения читаемости кода и обработки ошибок

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("JavaScript")) -.-> javascript/BasicConceptsGroup(["Basic Concepts"]) javascript(("JavaScript")) -.-> javascript/AdvancedConceptsGroup(["Advanced Concepts"]) javascript/BasicConceptsGroup -.-> javascript/functions("Functions") javascript/AdvancedConceptsGroup -.-> javascript/async_prog("Asynchronous Programming") javascript/AdvancedConceptsGroup -.-> javascript/error_handle("Error Handling") subgraph Lab Skills javascript/functions -.-> lab-445680{{"Преобразование асинхронных функций с обратными вызовами в функции, основанные на промисах"}} javascript/async_prog -.-> lab-445680{{"Преобразование асинхронных функций с обратными вызовами в функции, основанные на промисах"}} javascript/error_handle -.-> lab-445680{{"Преобразование асинхронных функций с обратными вызовами в функции, основанные на промисах"}} end

Преобразование функции readFile в функцию, основанную на промисах

В этом шаге вы научитесь превращать функцию readFile из модуля fs в Node.js в функцию, основанную на промисах. Следуйте шагам ниже, чтобы выполнить этот шаг:

  1. Откройте файл index.js в вашем редакторе кода.
  2. Импортируйте необходимые модули в начале файла:
const fs = require("fs");
const path = require("path");
  1. Определите путь к файлу test-promisefy.json:
const textPath = path.join(__dirname, "/test-promisefy.json");
  1. Реализуйте функцию 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 и либо разрешает промис результатом, либо отклоняет его с ошибкой.

  1. Используйте функцию promisefy, чтобы создать версию функции readFile, основанную на промисах:
const readFileSync = promisefy(fs.readFile);

Теперь вы можете использовать функцию readFileSync для асинхронного чтения файла test-promisefy.json с использованием промисов.

Чтение файла с использованием функции readFile, основанной на промисах

В этом шаге вы научитесь использовать функцию readFileSync, основанную на промисах, для чтения файла test-promisefy.json.

  1. Добавьте следующий код в файл 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.

  1. Теперь ваш файл 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;
  1. Запустите файл index.js в терминале:
node index

Вы должны увидеть вывод true, что означает, что функция readFile, основанная на промисах, вернула то же самое содержимое, что и исходная функция readFile с обратными вызовами.

Поздравляем! Вы успешно преобразовали функцию readFile в функцию, основанную на промисах, и использовали версию, основанную на промисах, для чтения файла.

✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.