Menu
CoddyTech

Promise

CoddyのNode.jsジャーニー「Node.jsの基礎」セクションの一部。レッスン 21/33。

コールバックを入れ子にすると追いにくくなり、それぞれで必ずerrを確認する必要があります。

node:fs/promisesは代わりにpromiseを返します。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が失敗すると、プログラムはクラッシュします。

challenge icon

チャレンジ

簡単

この手順では、Callbacksのプロジェクトファイル(count.jsなど)ではなく、このコース用に用意されたメモ用コマンドラインツールのプロジェクトを開きます。以前の作業は、以前のレッスンにそのまま残ります。count.jsを編集する前に、提供されたファイルを読んでください。このコピーには、非同期のメモ数カウントの例が含まれています。

  • node:fs/promisesのreadFileと.thenを使って、count.jsを書き換えます。
  • ファイルが見つからない場合は、.catchによってNo notes yetと表示されるようになりました。
  • .finallyによって、最後にDoneが表示されます。

node count.jsを実行し、次にnode count.js nothere.jsonを実行してください。

引数を指定しない場合、出力はReading...、2 notes、Doneの順で、それぞれ別の行に表示されます。nothere.jsonを指定した場合、中央の行はNo notes yetになります。

自分で試してみよう

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');
});

Node.jsの基礎のすべてのレッスン

自分で練習してみよう: Expressプレイグラウンド