はじめに
今回初めて、fs(File System)の同期と非同期について気になったのでまとめてみました。
fs(File System)とは
Webアプリやサーバー開発では、ファイルの読み書きをする場面が多くあります。Node.jsでそれを可能にするのがfs(File System)モジュールになります。
使用方法
import fs from "fs";
こちらはNode.jsの標準モジュールになりますのでimportをすることで使用することができます。これにより、ファイルを読み込む・書き込む・削除する・情報を取得するなどの操作が可能になる。
非同期/同期について
まず非同期/同期の違いについて説明いたします。
・非同期
→これ書き込んでおいて!とOSにお願いして、Node.jsの処理を続けるイメージ(writeFile)
・同期
→書き込みが完全に終わるまで待つので、他の処理はいったん止まる
同期処理
import fs from "fs";
const data = fs.readFileSync("./example.txt","utf-8");//同期 → 読み込まれるまで待つよ
console.log(data);//読み込まれてから表示されるよ!
fs.writeFileSync("./example.txt", "こんにちは、Node.js!");//同期
readFileSync/writeFileSyncは処理が完了するまで次の処理が止まります。
非同期処理
import fs from "fs";
console.log("1.読み込み開始");
fs.readFile("example.txt", "utf-8", (err,data) => {
if(err) throw err;
console.log("3.ファイル内容:",data);
});
console.log("2.読み込み中に実行される");
第二引数で、文字コードで文字列を指定しています。
上記は非同期処理なのでノンストップで処理が続きます。なので下記のような呼び出し順になります。
console.log
1.読み込み開始
2.読み込み中に実行される
3.ファイル内容:hello!
Promiseを使用した記述方法
import { promise as fs } from "fs";
async function run () {
try {
await fs.writeFile("example.txt","async/await で書き込み");
console.log("書き込み完了!");
} catch (err) {
console.error("エラー:",err);
}
}
run();
Promiseを使用することでawaitやthenの記述ができるようになり、非同期処理でも順序通りに処理を待たせることができます。
まとめ
同期と非同期の流れについて、少し考え込んでしまいした。ですが、Promiseと一緒に使用することでモダンな書き方を非同期処理を動かすという理解は身についたかなと思います。💦
JISOUのメンバー募集中!
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてください!