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
promisefypara encapsular uma função baseada em callback e retornar uma Promise - Como usar a versão baseada em Promise da função
readFilepara 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
promisefypara 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:
- Abra o arquivo
index.jsno seu editor de código. - Importe os módulos necessários no topo do arquivo:
const fs = require("fs");
const path = require("path");
- Defina o caminho do arquivo para o arquivo
test-promisefy.json:
const textPath = path.join(__dirname, "/test-promisefy.json");
- 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.
- Use a função
promisefypara criar uma versão baseada em Promise da funçãoreadFile:
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.
- 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.
- Agora, seu arquivo
index.jsdeve 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;
- Execute o arquivo
index.jsno 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.



