Study
Vapor

Async/Await di Vapor

Penjelasan

Versi awal Vapor memakai EventLoopFuture (mirip Promise) untuk operasi asynchronous, dirangkai lewat .flatMap/.map yang bisa jadi sulit dibaca kalau berlapis-lapis. Sejak Swift mendukung concurrency native (async/await) dan Vapor mengadopsinya penuh, kamu bisa menulis handler dengan tanda async throws pada closure, lalu memakai await langsung pada pemanggilan API Fluent atau HTTP client, tanpa perlu callback bersarang. Secara fungsional, kedua gaya (EventLoopFuture vs async/await) setara — Vapor menjembatani keduanya secara otomatis. Untuk kode baru, gaya async/await sangat direkomendasikan karena jauh lebih mudah dibaca dan didebug, terutama saat menggabungkan beberapa operasi database berurutan.

Contoh Konsep

import Fluent
import Vapor

func routes(_ app: Application) throws {
    // Gaya lama (EventLoopFuture)
    app.get("lama") { req -> EventLoopFuture<[Catatan]> in
        Catatan.query(on: req.db).all()
    }

    // Gaya modern (async/await)
    app.get("baru") { req async throws -> [Catatan] in
        let semuaCatatan = try await Catatan.query(on: req.db).all()
        let terurut = semuaCatatan.sorted { $0.judul < $1.judul }
        return terurut
    }
}

Praktikum

Tulis ulang route app.post("catatan") memakai gaya async/await: decode BuatCatatanRequest, buat instance Catatan baru dari input, simpan lewat await catatan.save(on: req.db), lalu kembalikan catatan yang sudah tersimpan.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Jangan campur gaya EventLoopFuture manual dengan await sembarangan dalam satu handler — pilih satu gaya konsisten per handler supaya alur error handling (try/catch vs .flatMapError) tidak membingungkan.