0Pricing
Lua Academy · Pelajaran

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()
end

Pembungkus 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
end

Objek 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
end

await 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()
end

Berurutan 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
end

Pembatalan

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

  1. Membangun Perulangan Peristiwa Sederhana
  2. Async/Await dengan Coroutine
  3. Pola Mirip Promise
  4. I/O Non-Pemblokiran dengan luasocket
← Kembali ke Lua Academy