Skip to content

封装 Promisefy 函数

作者:江月迟迟
发表于:2024-12-10
字数统计:693 字
预计阅读3分钟

介绍

我们知道在浏览器中 JavaScript 是单线程运行的,而回调函数曾经是 JavaScript 中实现异步函数的主要方式,面对这样的嵌套回调,处理错误也会变得非常困难:你必须在“金字塔”的每一级处理错误,而不是在最高一级一次完成错误处理,所以大多数现代异步 API 采用的都是 Promise 的形式。

下面就请你以 Node.js 中常用的读取文件操作为例,封装一个 Promisefy 函数,将回调形式调用的读取文件方法转换成一个 Promise 的版本。

准备

目录结构如下:

bash
├── index.js
└── test.md

其中:

  • index.js 是需要补充代码的 js 文件。
  • test.md 供读取的示例文件。

注意:打开环境后发现缺少项目代码,请复制下述命令至命令行进行下载。

bash
cd /home/project
wget https://labfile.oss.aliyuncs.com/courses/18164/dist_01.zip
unzip dist_01.zip
mv dist/* ./
rm -rf dist*

目标

请在 index.js 文件中的补全代码,完成 promisefy 函数的封装。将 fs 中的 readFile 方法 promise 化。也就是说 readFileSync 方法执行后,会返回一个 promise,可以调用 then 方法执行成功的回调或失败的回调。

在实际应用中,一个函数满足这几个条件,就可以被 promisify 化:

  • 该方法必须包含回调函数
  • 回调函数必须执行
  • 回到函数第一个参数代表 err 信息,第二个参数代表成功返回的结果

在控制台运行:

bash
node index

此时应打印出 true,即:回调形式的 fs.readFile 方法读取同个文件的结果与 Promise 形式读取结果一致。

规定

  • 请按照给出的步骤操作,切勿修改默认提供的文件名称、文件夹路径等。

判分标准

  • 本题完全实现题目目标得满分,否则得 0 分。

总通过次数: 884 | 总提交次数: 914 | 通过率: 96.7%

难度: 中等 标签: 2022, 省模拟赛, Web 前端, Node.js

题解

js
// 定义 promisify 函数
const promisify = (func) => {
  // 返回一个新的函数,该函数接受原函数的参数,并返回一个 Promise
  return (...args) => {
    return new Promise((resolve, reject) => {
      // 在新的函数中调用原函数,并处理结果
      func(...args, (err, data) => {
        if (err) {
          reject(err); // 如果有错误,将 Promise 置为 rejected 状态,并传递错误信息
        } else {
          resolve(data); // 如果没有错误,将 Promise 置为 resolved 状态,并传递数据
        }
      });
    });
  };
};