Transformando Funções Assíncronas Baseadas em Callback em Promises

JavaScriptBeginner
Pratique Agora

Introdução

Neste projeto, você aprenderá como transformar uma função assíncrona baseada em callback em JavaScript em uma função baseada em Promise. Especificamente, você converterá a função readFile baseada em callback do módulo fs em Node.js em uma versão baseada em Promise.

🎯 Tarefas

Neste projeto, você aprenderá:

  • Como identificar as condições para transformar uma função em Promise (promisify)
  • Como implementar uma função promisefy para encapsular uma função baseada em callback e retornar uma Promise
  • Como usar a versão baseada em Promise da função readFile para ler um arquivo de forma assíncrona

🏆 Conquistas

Após concluir este projeto, você será capaz de:

  • Compreender os benefícios de usar Promises em vez de programação assíncrona baseada em callback
  • Implementar uma função genérica promisefy para converter funções baseadas em callback em funções baseadas em Promise
  • Utilizar funções assíncronas baseadas em Promise em seus próprios projetos para melhorar a legibilidade do código e o tratamento de erros

Transformar a Função readFile em Promise

Nesta etapa, você aprenderá como transformar a função readFile do módulo fs em Node.js em uma função baseada em Promise (promisify). Siga os passos abaixo para completar esta etapa:

  1. Abra o arquivo index.js no seu editor de código.
  2. Importe os módulos necessários no topo do arquivo:
const fs = require("fs");
const path = require("path");
  1. Defina o caminho do arquivo para o arquivo test-promisefy.json:
const textPath = path.join(__dirname, "/test-promisefy.json");
  1. Implemente a função promisefy:
const promisefy = (fn) => {
  return (textPath, type) => {
    return new Promise((resolve, reject) => {
      fn(textPath, type, (err, contrast) => {
        if (err) {
          reject(err);
        } else {
          resolve(contrast);
        }
      });
    });
  };
};

A função promisefy recebe uma função baseada em callback fn como argumento e retorna uma nova função que retorna uma Promise. A função retornada chama a função original fn e resolve a Promise com o resultado ou a rejeita com o erro.

  1. Use a função promisefy para criar uma versão baseada em Promise da função readFile:
const readFileSync = promisefy(fs.readFile);

Agora, você pode usar a função readFileSync para ler o arquivo test-promisefy.json de forma assíncrona usando Promises.

Ler o Arquivo Usando a Função readFile Baseada em Promise

Nesta etapa, você aprenderá como usar a função readFileSync baseada em Promise para ler o arquivo test-promisefy.json.

  1. Adicione o seguinte código ao arquivo index.js:
fs.readFile(textPath, "utf8", (err, contrast) => {
  const readFileSync = promisefy(fs.readFile);

  readFileSync(textPath, "utf8")
    .then((res) => {
      console.log(res === contrast); // The result here is expected: true, i.e. the promise returns the same content as the previous read.
    })
    .catch((err) => {});
});

Este código chama a função readFileSync com o caminho do arquivo e a codificação, e então lida com a resolução e rejeição da Promise usando os métodos then e catch.

  1. Agora, seu arquivo index.js deve se parecer com isto:
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); // The result here is expected: true, i.e. the promise returns the same content as the previous read.
    })
    .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. Execute o arquivo index.js no terminal:
node index

Você deve ver a saída true, o que significa que a função readFile baseada em Promise retornou o mesmo conteúdo que a função readFile original baseada em callback.

Parabéns! Você transformou com sucesso a função readFile em Promise e usou a versão baseada em Promise para ler um arquivo.

Resumo

Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.

✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar