Async/Await dengan Coroutine
Buat pembantu async() dan await() yang menangguhkan dan melanjutkan coroutine.
Async/Await dengan Coroutine adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Gagasan Asinkron/await
Asinkron/await adalah model pemrograman yang membuat operasi asinkron tampak seperti kode sinkron. Dalam Lua, korutin menyediakan mekanisme penyerahan kendali dan resume untuk menerapkannya secara alami.
Fungsi await
await(future) menjeda korutin saat ini dan menyimpan panggilan balik yang melakukan resume terhadapnya ketika hasil mendatang selesai.
local function await(future)
local co = coroutine.running()
future.onComplete = function(result)
coroutine.resume(co, result)
end
return coroutine.yield()
endPembungkus Fungsi Asinkron
async(fn) membungkus fungsi agar berjalan dalam korutin baru yang dikelola oleh penjadwal.
local function async(fn)
return function(...)
local co = coroutine.create(fn)
local ok, err = coroutine.resume(co, ...)
if not ok then print("async error:", err) end
return co
end
endObjek Hasil Mendatang Sederhana
Hasil mendatang merepresentasikan hasil yang masih menunggu. Panggil complete nanti, lalu lakukan resume terhadap semua korutin yang menunggunya.
local function newFuture()
local f = {done=false, value=nil, waiters={}}
f.complete = function(val)
f.done = true; f.value = val
for _, cb in ipairs(f.waiters) do cb(val) end
end
f.andThen = function(cb)
if f.done then cb(f.value)
else f.waiters[#f.waiters+1] = cb end
end
return f
endawait dalam Praktik
Tulis kode asinkron yang tampak berurutan, tetapi secara internal menyerahkan kendali dan melakukan resume.
local fetchData = async(function(url)
local result = await(httpGet(url)) -- yields
local parsed = await(parseJSON(result)) -- yields again
print("Got:", parsed.name)
end)
fetchData("http://example.com/api")Penerusan Kesalahan
Teruskan kesalahan melalui hasil mendatang: jika operasi gagal, lakukan resume terhadap korutin dengan penanda kesalahan dan pesan kesalahan.
local function awaitSafe(future)
local co = coroutine.running()
future.onComplete = function(ok, result)
coroutine.resume(co, ok, result)
end
return coroutine.yield()
endBerurutan vs Paralel
Gunakan await secara berurutan untuk operasi yang saling bergantung. Untuk operasi yang tidak saling bergantung, jalankan kedua korutin dan tunggu hasil mendatang penggabungan.
Pola Promise.all
Jalankan beberapa tugas asinkron dan tunggu hingga semuanya selesai menggunakan hasil mendatang penghitung.
local function all(futures)
local results = {}
local count = #futures
local combined = newFuture()
for i, f in ipairs(futures) do
f:andThen(function(v)
results[i] = v
count = count - 1
if count == 0 then combined.complete(results) end
end)
end
return combined
endPembatalan
Terapkan pembatalan dengan menandai korutin sebagai dibatalkan sebelum melakukan resume terhadapnya. Korutin memeriksa tanda tersebut dan segera mengembalikan hasil.
Integrasi dengan Masukan/Keluaran
Integrasikan dengan masukan/keluaran nonblokir: ketika panggilan masukan/keluaran akan memblokir, jeda dan daftarkan panggilan balik untuk melakukan resume ketika data tersedia.
Perbandingan dengan Gaya Panggilan Balik
Asinkron/await dengan korutin jauh lebih mudah dibaca daripada panggilan balik bertingkat. Penanganan kesalahan dengan pemanggilan yang terlindungi juga lebih rapi daripada parameter kesalahan pada panggilan balik.
Pertanyaan tentang Asinkron/await
Apa yang dilakukan await(future) dalam sistem asinkron berbasis korutin?
Ringkasan: Asinkron/await dengan Korutin
Terapkan asinkron/await dengan korutin dengan membungkus operasi asinkron sebagai hasil mendatang yang melakukan resume terhadap korutin yang dijeda ketika selesai. Hasilnya adalah kode yang tampak berurutan, tetapi sebenarnya tidak memblokir.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Async/Await dengan Coroutine” gratis?
Ya — teks lengkap “Async/Await dengan Coroutine” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Async/Await dengan Coroutine”?
Buat pembantu async() dan await() yang menangguhkan dan melanjutkan coroutine. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Async/Await dengan Coroutine” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membangun Perulangan Peristiwa Sederhana
- Async/Await dengan Coroutine
- Pola Mirip Promise
- I/O Non-Pemblokiran dengan luasocket