介绍
在这个项目中,你将学习如何在 JavaScript 中把基于回调的异步函数转换为基于 Promise 的函数。具体来说,你将把 Node.js 中fs模块里基于回调的readFile函数转换为基于 Promise 的版本。
🎯 任务
在这个项目中,你将学习:
- 如何确定将函数转换为基于 Promise 的函数的条件
- 如何实现一个
promisefy函数来包装基于回调的函数并返回一个 Promise - 如何使用基于 Promise 的
readFile函数异步读取文件
🏆 成果
完成这个项目后,你将能够:
- 理解使用 Promise 而非基于回调的异步编程的好处
- 实现一个通用的
promisefy函数,将基于回调的函数转换为基于 Promise 的函数 - 在自己的项目中使用基于 Promise 的异步函数,以提高代码的可读性和错误处理能力
将 readFile 函数转换为基于 Promise 的函数
在这一步中,你将学习如何把 Node.js 中fs模块里的readFile函数转换为基于 Promise 的函数。按照以下步骤完成这一步:
- 在你的代码编辑器中打开
index.js文件。 - 在文件顶部引入必要的模块:
const fs = require("fs");
const path = require("path");
- 定义
test-promisefy.json文件的文件路径:
const textPath = path.join(__dirname, "/test-promisefy.json");
- 实现
promisefy函数:
const promisefy = (fn) => {
return (textPath, type) => {
return new Promise((resolve, reject) => {
fn(textPath, type, (err, contrast) => {
if (err) {
reject(err);
} else {
resolve(contrast);
}
});
});
};
};
promisefy函数接受一个基于回调的函数fn作为参数,并返回一个新的函数,该函数返回一个 Promise。返回的函数调用原始的fn函数,并用结果解析 Promise,或者用错误拒绝它。
- 使用
promisefy函数创建一个基于 Promise 的readFile函数版本:
const readFileSync = promisefy(fs.readFile);
现在,你可以使用readFileSync函数通过 Promise 异步读取test-promisefy.json文件。
使用基于 Promise 的 readFile 函数读取文件
在这一步中,你将学习如何使用基于 Promise 的readFileSync函数来读取test-promisefy.json文件。
- 将以下代码添加到
index.js文件中:
fs.readFile(textPath, "utf8", (err, contrast) => {
const readFileSync = promisefy(fs.readFile);
readFileSync(textPath, "utf8")
.then((res) => {
console.log(res === contrast); // 这里预期的结果是:true,即 Promise 返回的内容与之前读取的相同。
})
.catch((err) => {});
});
这段代码使用文件路径和编码调用readFileSync函数,然后使用then和catch方法处理 Promise 的成功和失败情况。
- 现在,你的
index.js文件应该如下所示:
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); // 这里预期的结果是:true,即 Promise 返回的内容与之前读取的相同。
})
.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;
- 在终端中运行
index.js文件:
node index
你应该会看到输出true,这意味着基于 Promise 的readFile函数返回了与原始基于回调的readFile函数相同的内容。
恭喜!你已经成功地将readFile函数转换为基于 Promise 的函数,并使用基于 Promise 的版本读取了文件。
总结
恭喜!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。



