Menu
CoddyTech

Async dan Await

Termasuk bagian Dasar-Dasar Node.js dalam perjalanan Node.js di Coddy. Pelajaran 23 dari 33.

Rangkaian pemanggilan .then dibaca berbeda dari cara kamu memikirkan langkah-langkahnya: baca, lalu parse, lalu simpan.

Di dalam fungsi async, await menjeda eksekusi sampai promise selesai, lalu memberikan nilainya. Promise yang gagal akan melempar error di sana, jadi try dan catch menanganinya. Dalam module, await juga berfungsi di tingkat teratas.

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

const loadConfig = async () => {
    try {
        return JSON.parse(await readFile('config.json', 'utf8'));
    } catch {
        return {};
    }
};

const config = await loadConfig();
console.log(config.port ?? 3000);

Fungsi async selalu mengembalikan promise, jadi pemanggilnya juga harus menggunakan await. Jika lupa menggunakan await, kamu akan mendapatkan promise itu sendiri, Promise { <pending> }, bukan nilainya.

challenge icon

Tantangan

Mudah

Langkah ini membuka proyek alat baris perintah notes yang telah disiapkan untuk kursus, bukan file proyekmu dari Promises (termasuk count.js). Pekerjaanmu sebelumnya tetap berada di pelajarannya sendiri. Baca file yang disediakan sebelum mengedit store.js. Salinan ini berisi pembaca notes berbasis promise dan penanganan error-nya.

store.js sekarang menggunakan versi promise dari readFile dan writeFile, dan method-nya bersifat async. Namun, belum ada yang menunggu promise, jadi setiap perintah mengalami error. Tambahkan await di setiap tempat yang memerlukan promise selesai sebelum langkah berikutnya.

  1. Di store.js, dalam load, tunggu readFile selesai sebelum JSON.parse menggunakan teksnya.
  2. Di store.js, load bersifat async, jadi fungsi ini mengembalikan promise. Tunggu promise tersebut saat store menetapkan notes. Sebuah module dapat menggunakan await di tingkat teratas, di luar fungsi mana pun.
  3. Di store.js, tunggu writeFile dalam save, lalu tunggu this.save() dalam add dan remove.
  4. Di notes.js, store.add dan store.remove sekarang bersifat async. Tunggu keduanya di cabang add dan done, agar n dan removed menyimpan nilai, bukan promise.

Dengan begitu, ada tujuh await seluruhnya. Setelah itu, setiap perintah akan berfungsi seperti sebelumnya. list menampilkan notes di notes.json. Dengan dua notes awal, add Buy bread mencetak Saved note 3., lalu done 1 mencetak Done: Buy milk.

Coba: ketik list di kotak setelah $ node notes.js sebelum kamu mengubah apa pun. Kamu akan melihat notes.json is damaged: ..., tetapi file-nya baik-baik saja: JSON.parse diberi promise, bukan teks dari file. Setelah perubahanmu, list akan menampilkan notes lagi. Lalu, ketik add Buy bread dan lihat Saved note 3.. Ketik done 1 dan lihat Done: Buy Milk.

Coba sendiri

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

const file = 'notes.json';

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

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

export default store;
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar Node.js

Latihan sendiri: Playground Express