🫠

Rustのasync/awaitとTypeScriptのasync/awaitって実は別物?

2023/07/01に公開

はじめに

所謂ベンチャーでフロントエンドエンジニアをやっております。白色と申します。
4回目の投稿となります。

概要

RustとTypeScriptは両方ともasync/awaitをサポートしていますが、その実装にはいくつかの主な違いがあると噂で聞きました。実際どのように違うの気になったので、以下では、それぞれの言語でのasync/awaitの違いについて説明します。

Rust

Rustのasyncブロックは、非同期のフューチャー(futures)を返す必要があります。フューチャーは、非同期操作が完了したときに値を生成するためのプロミスとして機能します。

use std::time::Duration;
use tokio::time::sleep;

async fn async_function() {
    println!("Start");
    sleep(Duration::from_secs(1)).await;
    println!("End");
}

#[tokio::main]
async fn main() {
    async_function().await;
}

Rustのasync/awaitは、asyncキーワードで非同期関数を定義し、内部で非同期操作を実行します。非同期操作が完了するまで、他のタスクに制御を戻すことができます。

TypeScript

TypeScriptのasync/awaitも、Rustと同様に、非同期コードを記述するための基本的な構文です。しかし、その実装は似て非なるものです。まず、TypeScriptのasync/awaitは、JavaScriptのランタイムに依存しています。

function sleep(ms: number) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function asyncFunction() {
  console.log("Start");
  await sleep(1000);
  console.log("End");
}

async function main() {
  await asyncFunction();
}

main();

TypeScriptのasync/awaitも、asyncキーワードを使用して非同期関数を定義します。ただし、Rustとは異なり、TypeScriptではPromiseオブジェクトを返す非同期関数内でawaitキーワードを使用して非同期処理を待機します。

違いまとめ

  • Rustのasync/awaitはasyncキーワードを使用し、非同期関数内で非同期操作を直接実行します。
  • TypeScriptのasync/awaitはasyncキーワードを使用し、非同期関数内でPromiseオブジェクトを返す他の非同期関数をawaitキーワードで待機します。

あとがき

以上がRustのasync/awaitとTypeScriptのasync/awaitの違いです。それぞれの言語で非同期処理を行うための特定の構文を持っており、その使い方には注意が必要です。

Discussion