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.
Tantangan
MudahLangkah 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.
- Di
store.js, dalamload, tunggureadFileselesai sebelumJSON.parsemenggunakan teksnya. - Di
store.js,loadbersifatasync, jadi fungsi ini mengembalikan promise. Tunggu promise tersebut saat store menetapkannotes. Sebuah module dapat menggunakanawaitdi tingkat teratas, di luar fungsi mana pun. - Di
store.js, tungguwriteFiledalamsave, lalu tungguthis.save()dalamadddanremove. - Di
notes.js,store.adddanstore.removesekarang bersifatasync. Tunggu keduanya di cabangadddandone, agarndanremovedmenyimpan 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;
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar Node.js
1Menjalankan JavaScript di Node
Halo, NodeMembaca PerintahArgumen Baris PerintahPerintah5Peristiwa, Input, dan Package
Dengarkan Sebelum MengirimkanPemancar PeristiwaMembaca InputLatihan sendiri: Playground Express