非同期プログラミング(ロードマップ)

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
}