Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Bu 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.

  1. store.js dosyasındaki load içinde, JSON.parse metni kullanmadan önce readFile işleminin tamamlanmasını bekle.
  2. store.js dosyasındaki load, async olduğundan bir promise döndürür. Depo notes değerini ayarlarken bu promise’in tamamlanmasını bekle. Bir modül, herhangi bir işlevin dışında, en üst düzeyde await kullanabilir.
  3. store.js dosyasında save içindeki writeFile işleminin, add ve remove içindeki this.save() çağrılarının tamamlanmasını bekle.
  4. notes.js dosyasında store.add ve store.remove artık async. add ve done dallarında bunların tamamlanmasını bekle; böylece n ve removed promise’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;
quiz iconKendini test et

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

Kendi başına pratik yap: Express playground