Promise
CoddyのNode.jsジャーニー「Node.jsの基礎」セクションの一部。レッスン 15/24。
コールバックが入れ子になると追いかけるのが難しくなり、それぞれで必ずerrを確認しなければなりません。
node:fs/promisesは代わりにpromiseを返します。これは、後から届く結果を表すオブジェクトです。.then(fn)は結果を受け取って実行され、.catch(fn)はそれ以前のいずれかの段階で失敗した場合に実行され、.finally(fn)はどちらの場合でも実行されます。
import { readFile } from 'node:fs/promises';
readFile('poem.txt', 'utf8')
.then((text) => console.log(text.length + ' characters'))
.catch(() => console.log('No poem today'))
.finally(() => console.log('Bye'));.thenの中でスローされたエラーも.catchに渡されるため、読み込みと解析の両方を1つのハンドラーで処理できます。.catchのないpromiseが失敗すると、プログラムはクラッシュします。
チャレンジ
簡単count.jsを、node:fs/promisesのreadFileと.thenを使って書き直します。- ファイルが見つからない場合は、
.catchによってNo notes yetが表示されるようになりました。 .finallyによるDoneの表示は、引き続き最後に行われます。
node count.jsを実行し、次にnode count.js nothere.jsonを実行します。
自分で試してみよう
import fs from 'node:fs';
const file = process.argv[2] ?? 'notes.json';
console.log('Reading...');
fs.readFile(file, 'utf8', (err, text) => {
if (err) {
console.log(`Cannot read ${file}`);
} else {
console.log(`${JSON.parse(text).length} notes`);
}
console.log('Done');
});