はじめに
このプロジェクトでは、JavaScript でコールバックベースの非同期関数をプロミスに変換する方法を学びます。具体的には、Node.js の fs モジュールにあるコールバックベースの readFile 関数をプロミスベースのバージョンに変換します。
🎯 タスク
このプロジェクトでは、以下を学びます。
- 関数をプロミスに変換する条件を特定する方法
- コールバックベースの関数をラップしてプロミスを返す
promisefy関数を実装する方法 - プロミスベースの
readFile関数を使ってファイルを非同期で読み取る方法
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- コールバックベースの非同期プログラミングよりもプロミスを使う利点を理解する
- コールバックベースの関数をプロミスベースの関数に変換する汎用的な
promisefy関数を実装する - 独自のプロジェクトでプロミスベースの非同期関数を利用して、コードの読みやすさとエラーハンドリングを向上させる
readFile 関数をプロミスに変換する
このステップでは、Node.js の fs モジュールの readFile 関数をプロミスに変換する方法を学びます。以下の手順に従ってこのステップを完了しましょう。
- コードエディタで
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関数を使って、readFile関数のプロミスベースのバージョンを作成します。
const readFileSync = promisefy(fs.readFile);
これで、readFileSync 関数を使って、Promise を使って test-promisefy.json ファイルを非同期で読み取ることができます。
プロミスベースの readFile 関数を使ってファイルを読み取る
このステップでは、プロミスベースの 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、つまりプロミスは前回の読み取りと同じ内容を返します。
})
.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、つまりプロミスは前回の読み取りと同じ内容を返します。
})
.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 という出力が表示されるはずで、これはプロミスベースの readFile 関数が元のコールバックベースの readFile 関数と同じ内容を返したことを意味します。
おめでとうございます!あなたは成功裏に readFile 関数をプロミスに変換し、プロミスベースのバージョンを使ってファイルを読み取りました。
まとめ
おめでとうございます!このプロジェクトを完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習してください。



