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