Async ve Await
Coddy'nin Node.js Journey'sinin Node.js Temelleri bölümünün bir parçası. Ders 23 / 33.
.then çağrıları zincirini okumak, adımları düşünme biçiminden farklıdır: oku, sonra ayrıştır, ardından kaydet.
async bir işlevin içinde await, bir promise sonuçlanana kadar bekler ve değerini verir. Başarısız olan bir promise burada hata fırlatır; bu nedenle try ve catch bunu işler. Bir modülde await en üst düzeyde de çalışır.
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);async bir işlev her zaman bir promise döndürür; bu nedenle onu çağıran da await kullanır. Bir await ifadesini unutursan, değeri yerine promise'ın kendisini, Promise { <pending> }, alırsın.
Görev
KolayBu adım, Promises dersindeki proje dosyaların yerine, ders için hazırlanmış notlar komut satırı aracı projesini açar (count.js dâhil). Önceki çalışmaların kendi dersinde kalır. store.js dosyasını düzenlemeden önce verilen dosyaları oku. Bu kopyada promise tabanlı not okuyucu ve hata yönetimi bulunur.
store.js artık readFile ve writeFile işlevlerinin promise sürümlerini kullanıyor ve yöntemleri async. Ancak henüz hiçbir şey promise’lerin tamamlanmasını beklemiyor; bu yüzden her komut hata veriyor. Bir sonraki adımdan önce promise’in tamamlanması gereken her yere await ekle.
store.jsdosyasındakiloadiçinde,JSON.parsemetni kullanmadan öncereadFileişleminin tamamlanmasını bekle.store.jsdosyasındakiload,asyncolduğundan bir promise döndürür. Deponotesdeğerini ayarlarken bu promise’in tamamlanmasını bekle. Bir modül, herhangi bir işlevin dışında, en üst düzeydeawaitkullanabilir.store.jsdosyasındasaveiçindekiwriteFileişleminin,addveremoveiçindekithis.save()çağrılarının tamamlanmasını bekle.notes.jsdosyasındastore.addvestore.removeartıkasync.addvedonedallarında bunların tamamlanmasını bekle; böylecenveremovedpromise’leri değil, değerleri tutar.
Böylece toplam yedi await olur. Sonrasında her komut eskisi gibi çalışır. list, notes.json içindeki notları gösterir. Başlangıçtaki iki not varken, add Buy bread komutu Saved note 3. çıktısını verir; ardından done 1 komutu Done: Buy milk çıktısını verir.
Denemek için: Henüz hiçbir şeyi değiştirmeden önce kutuya, $ node notes.js ifadesinden sonra list yaz. notes.json is damaged: ... mesajını görürsün ama dosya sağlamdır: JSON.parse işlevine dosyanın metni yerine bir promise verilmiştir. Değişikliklerinden sonra list notları tekrar gösterir. Ardından add Buy bread yaz ve Saved note 3. çıktısını gör. done 1 yaz ve Done: Buy milk çıktısını gör.
Kendin dene
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
// readFile ve writeFile artık promise döndürüyor. Her birini await ile bekleyin.
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;
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Node.js Temelleri bölümündeki tüm dersler
1JavaScript’i Node Üzerinde Çalıştırma
Merhaba, NodeKomutu OkumaKomut Satırı ArgümanlarıKomutlarKendi başına pratik yap: Express playground