非同期プログラミング(ロードマップ)
async / await による非同期処理の構想を学びます。
ロードマップ(未実装)
async / await は現行のコンパイラー(v0.2.0)では完全に未実装です。以下のコードはコンパイルできません。現行では同期処理のみが可能です。
現行仕様: 同期処理のみ
現行では非同期構文は使えず、関数はすべて同期的に実行されます。複雑な制御は並列化せず、if / while で順に処理します。
sync.ngs
fn fetch_sync() -> string {
return "data"
}
fn main() {
val data = fetch_sync()
println(data)
}
async 関数(ロードマップ)
将来仕様
以下は async / await が実装された後に動く予定のコードです(現行の v0.2.0 では動きません)。
async_fetch.ngs
async fn fetch_data(url: string) -> string {
val response = await http.get(url)
return response.body
}
fn main() {
val data = await fetch_data("https://api.example.com/data")
println(data)
}
await(ロードマップ)
await は非同期操作の完了を待ちます(将来仕様):
await.ngs
async fn process() {
val a = await heavy_computation()
val b = await another_computation()
println(a + b)
}
async ブロック(ロードマップ)
async_block.ngs
async fn parallel() {
val result = async {
val a = await fetch("url1")
val b = await fetch("url2")
(a, b)
}
val (data1, data2) = await result
}
非同期とエラー処理(ロードマップ)
将来的には非同期 API も enum で自作した Result と組み合わせて使う予定です。組み込みの Result は現行では存在しないため、自作してください。
safe_fetch.ngs
enum Result {
Ok
Error
}
async fn safe_fetch(url: string) -> Result {
val response = await http.get(url)
if response.ok {
return Result.Ok
}
return Result.Error
}
