Promise.all
CoddyのNode.jsジャーニー「Node.jsの基礎」セクションの一部。レッスン 25/33。
独立した読み込みでは、1つの結果の異なる部分を取得できます。両方の処理を開始し、結果を待ってから、それぞれの結果を目的に応じて使います。
const [forecast, location] = await Promise.all([
readFile('forecast.txt', 'utf8'),
readFile('location.txt', 'utf8'),
]);
console.log(location + ': ' + forecast);結果の順序は入力配列に従うため、2つ目の読み込みが先に完了しても変わりません。ノート用ツールでは、ノートと表示設定を読み込みます。用意されているreadJsonヘルパーは、ファイルがない場合や破損している場合に対応します。表示行を逆順にする前にノート番号を整形することで、表示を切り替えても、番号が示すノートは変わりません。
チャレンジ
簡単このステップでは、Async and Awaitのプロジェクトファイル(store.jsを含む)ではなく、コースで用意されたメモ用コマンドラインツールのプロジェクトを開きます。以前の作業は、それぞれのレッスン内に残ります。store.jsを編集する前に、提供されたファイルを読んでください。このコピーには、メモ用コマンド、JSONリーダー、設定ファイルが含まれています。
メモ用ツールは、notes.jsonとsettings.jsonの両方を必要とするようになりました。用意されているreadJson(name, fallback)ヘルパーは、既存のファイルエラー処理を維持します。
store.jsで、空のプレースホルダーを、Promise.allを使って両方のファイルをまとめて読み込んだ結果に置き換えます。メモファイルがない場合は[]を使い、設定ファイルがない場合は{}を使います。notes.jsでは、list分岐がすでに番号付きの行を作成しています。store.settings.sortがnewestの場合は、表示する前にその行を逆順にします。それ以外の設定では、元の順序を保ちます。
listを試します。Notes for youの後に、2. Call Ada、1. Buy milkの順で表示されるはずです。設定をoldestに変更してもう一度試すと、同じ番号が昇順で表示されます。確認する前にnewestに戻してください。
自分で試してみよう
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
const readJson = async (name, fallback) => {
if (!existsSync(name)) {
return fallback;
}
try {
return JSON.parse(await readFile(name, 'utf8'));
} catch (err) {
console.error(`${name} is damaged: ${err.message}`);
process.exit(1);
}
};
// これらの仮の値を2つのreadJsonの結果に置き換えてください。
const notes = [];
const settings = {};
const store = {
notes,
settings,
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の基礎のすべてのレッスン
自分で練習してみよう: Expressプレイグラウンド