封装 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 状态,并传递数据
}
});
});
};
};