Menu
CoddyTech

Promise.all

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

ストアには notes と settings の 2 つのファイルが必要になりました。これらを順番に読み込むと、待ち時間が 2 回発生します。

Promise.all([a, b])を使うと、2 つの Promise を同時に実行し、両方が完了するまで待ちます。結果は配列と同じ順序で返され、どちらか一方が失敗するとすぐに失敗します。

const [user, prefs] = await Promise.all([
    readFile('user.json', 'utf8'),
    readFile('prefs.json', 'utf8'),
]);

読み込み同士が依存していない場合に使います。2 つ目の読み込みで 1 つ目の結果が必要な場合は、1 つずつ await します。

challenge icon

チャレンジ

簡単
  • store.js は Promise.all を使って、notes.json と settings.json を同時に読み込みます。設定ファイルが存在しない場合は、{} として扱われます。
  • settings.json に "sort": "newest" がある場合、list は最新のメモを先頭に出力します。各メモの番号はそのままです。

node notes.js list を実行します。次に、settings.json の newest を oldest に変更して、もう一度実行します。

自分で試してみよう

import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';

const file = 'notes.json';

const load = async () => {
    if (!existsSync(file)) {
        return [];
    }
    try {
        return JSON.parse(await readFile(file, 'utf8'));
    } catch (err) {
        console.error(`notes.json is damaged: ${err.message}`);
        process.exit(1);
    }
};

const store = {
    notes: await load(),
    async save() {
        await writeFile(file, JSON.stringify(this.notes, null, 2));
    },
    async add(text) {
        this.notes.push(text);
        await this.save();
        return this.notes.length;
    },
    async remove(n) {
        const [text] = this.notes.splice(n - 1, 1);
        await this.save();
        return text;
    },
};

export default store;

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