Menu
CoddyTech

Promise.all

Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 25 z 33.

Niezależne odczyty mogą dostarczyć różne części jednego wyniku. Rozpocznij obie operacje, poczekaj na ich wyniki, a następnie wykorzystaj każdy z nich do własnego celu.

const [forecast, location] = await Promise.all([
    readFile('forecast.txt', 'utf8'),
    readFile('location.txt', 'utf8'),
]);
console.log(location + ': ' + forecast);

Kolejność wyników odpowiada kolejności elementów w tablicy wejściowej, nawet jeśli drugi odczyt zakończy się jako pierwszy. Twoje narzędzie do notatek odczytuje natomiast notatki i ustawienie wyświetlania. Przygotowana funkcja pomocnicza readJson obsługuje brakujące i uszkodzone pliki. Formatuj numery notatek przed odwróceniem kolejności wyświetlanych wierszy, aby zmiana widoku nigdy nie zmieniała tego, którą notatkę wskazuje dany numer.

challenge icon

Wyzwanie

Łatwy

Ten krok otwiera przygotowany w kursie projekt narzędzia wiersza poleceń do notatek, a nie pliki projektu z lekcji Async and Await (w tym store.js). Twoja wcześniejsza praca pozostaje w swojej lekcji. Przed edycją store.js przeczytaj dostarczone pliki. Ta kopia zawiera polecenia do obsługi notatek, czytnik JSON i plik konfiguracji.

Narzędzie do notatek potrzebuje teraz zarówno notes.json, jak i settings.json. Dostarczona funkcja pomocnicza readJson(name, fallback) zachowuje dotychczasową obsługę błędów plików.

  1. W store.js zastąp puste symbole zastępcze wynikami jednoczesnego odczytu obu plików za pomocą Promise.all. Jeśli brakuje pliku z notatkami, użyj []; jeśli brakuje ustawień, użyj {}.
  2. W notes.js gałąź list już tworzy ponumerowane wiersze. Gdy store.settings.sort ma wartość newest, odwróć kolejność tych wierszy przed ich wyświetleniem. Każda inna wartość ustawienia zachowuje pierwotną kolejność.

Wypróbuj list: po Notes for you oczekuj 2. Call Ada, 1. Buy milk. Zmień ustawienie na oldest i spróbuj ponownie: te same numery pojawią się w kolejności rosnącej. Przed sprawdzeniem przywróć newest.

Spróbuj swoich sił

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

// Zastąp te wartości zastępcze dwoma wynikami funkcji 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;

Wszystkie lekcje w sekcji Podstawy Node.js

Poćwicz samodzielnie: Edytor online Express