Promisificar funciones asíncronas basadas en callbacks

JavaScriptJavaScriptBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este proyecto, aprenderás cómo promisificar una función asincrónica basada en callbacks en JavaScript. Específicamente, convertirás la función readFile basada en callbacks del módulo fs en Node.js en una versión basada en Promesas.

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo identificar las condiciones para promisificar una función
  • Cómo implementar una función promisefy para envolver una función basada en callbacks y devolver una Promesa
  • Cómo usar la versión basada en Promesas de la función readFile para leer un archivo de manera asíncrona

🏆 Logros

Después de completar este proyecto, podrás:

  • Comprender los beneficios de usar Promesas en lugar de la programación asíncrona basada en callbacks
  • Implementar una función genérica promisefy para convertir funciones basadas en callbacks en funciones basadas en Promesas
  • Utilizar funciones asíncronas basadas en Promesas en tus propios proyectos para mejorar la legibilidad del código y el manejo de errores

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{{"Promisificar funciones asíncronas basadas en callbacks"}} javascript/async_prog -.-> lab-445680{{"Promisificar funciones asíncronas basadas en callbacks"}} javascript/error_handle -.-> lab-445680{{"Promisificar funciones asíncronas basadas en callbacks"}} end

Promisificar la función readFile

En este paso, aprenderás cómo promisificar la función readFile del módulo fs en Node.js. Siga los pasos siguientes para completar este paso:

  1. Abra el archivo index.js en su editor de código.
  2. Requiera los módulos necesarios al principio del archivo:
const fs = require("fs");
const path = require("path");
  1. Defina la ruta del archivo para el archivo test-promisefy.json:
const textPath = path.join(__dirname, "/test-promisefy.json");
  1. Implemente la función promisefy:
const promisefy = (fn) => {
  return (textPath, type) => {
    return new Promise((resolve, reject) => {
      fn(textPath, type, (err, contrast) => {
        if (err) {
          reject(err);
        } else {
          resolve(contrast);
        }
      });
    });
  };
};

La función promisefy toma una función basada en callback fn como argumento y devuelve una nueva función que devuelve una Promesa. La función devuelta llama a la función original fn y resuelve la Promesa con el resultado o la rechaza con el error.

  1. Utilice la función promisefy para crear una versión basada en Promesas de la función readFile:
const readFileSync = promisefy(fs.readFile);

Ahora, puede usar la función readFileSync para leer el archivo test-promisefy.json de manera asíncrona usando Promesas.

Leer el archivo usando la función readFile basada en Promesas

En este paso, aprenderás cómo usar la función readFileSync basada en Promesas para leer el archivo test-promisefy.json.

  1. Agregue el siguiente código al archivo index.js:
fs.readFile(textPath, "utf8", (err, contrast) => {
  const readFileSync = promisefy(fs.readFile);

  readFileSync(textPath, "utf8")
    .then((res) => {
      console.log(res === contrast); // El resultado aquí se espera: true, es decir, la promesa devuelve el mismo contenido que la lectura anterior.
    })
    .catch((err) => {});
});

Este código llama a la función readFileSync con la ruta del archivo y la codificación, y luego maneja la resolución y rechazo de la Promesa usando los métodos then y catch.

  1. Ahora, su archivo index.js debería verse así:
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); // El resultado aquí se espera: true, es decir, la promesa devuelve el mismo contenido que la lectura anterior.
    })
    .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. Ejecute el archivo index.js en la terminal:
node index

Debería ver la salida true, lo que significa que la función readFile basada en Promesas devolvió el mismo contenido que la función readFile original basada en callbacks.

¡Felicitaciones! Ha promisificado con éxito la función readFile y ha usado la versión basada en Promesas para leer un archivo.

✨ Revisar Solución y Practicar

Resumen

¡Felicitaciones! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.