0Pricing
Dart Academy · レッスン

async*でストリームを作成する

ジェネレーターからイベントをyieldする

「async*でストリームを作成する」はCoddyKit上の無料Dart Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDart Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Dart Academyコースには全4レッスンが含まれています。

自分でStreamを生成する

これまでは他の人が作ったストリームを利用してきました。ここからはasync generatorを使って、自分でストリームを生成します。これはイベントを発行する最も簡潔な方法です。

async*キーワード

関数にasync*を付けると、ストリームジェネレーターになります。戻り値の型はStreamで、時間をかけて値を発行できます。🚿

Stream<int> countTo(int n) async* {
  // body uses yield
}

yieldで値を発行する

async*関数の中でyieldを使うと、1つの値をストリームに送ります。Listenerが次の値を受け取る準備ができるまで、実行はそこで一時停止します。

Stream<int> oneTwo() async* {
  yield 1;
  yield 2;
}

ループ内でyieldする

yieldとループを組み合わせると、多くの値を発行できます。ループが1回進むたびに、次の数値が自動的にストリームへ送られます。

Stream<int> countTo(int n) async* {
  for (var i = 1; i <= n; i++) yield i;
}

async*内のawait

関数はasyncなので、yieldの間にawaitを使えます。次のイベントを発行する前に、データを取得したり待機したりできます。

Stream<int> ticker() async* {
  while (true) {
    await Future.delayed(Duration(seconds: 1));
    yield DateTime.now().second;
  }
}

yield*でStreamを転送する

yield*を使うと、別のストリームのすべてのイベントをジェネレーター内から発行できます。そのストリーム全体を自分のストリームに組み込むことができます。

Stream<int> combined() async* {
  yield* countTo(3);
  yield 99;
}

ListenされるまでLazy

async*関数は、誰かがListenを開始するまで実行されません。Listenerが各値を要求したときにだけ、関数の本体が実行されます。⏸️

一時停止はListenerに合わせて行われる

Listenerが一時停止すると、ジェネレーターも次のyieldで一時停止します。このbackpressureにより、producerがconsumerを処理しきれないほど圧倒するのを防ぎます。

async*からのエラー

async*関数内のthrowは、ストリーム上のエイベントになります。Listenerは、通常のストリームエラーと同じように捕捉できます。

Stream<int> risky() async* {
  yield 1;
  throw 'boom';
}

自分のGeneratorを利用する

生成したストリームは、通常どおりawait forで読み取ります。yieldされた各値は、順番にループへ渡されます。

await for (final n in countTo(3)) {
  print(n);
}

async*とStreamControllerの比較

pullベースで順番に出力する場合、async*はStreamControllerより簡単です。イベントが外部のcallbackから届く場合にだけ、controllerを使いましょう。

簡単な確認

async*関数から値を発行するにはどうすればよいですか?

まとめ

async*でストリームを作り、yieldで値を送り、yield*で転送し、イベント間でawaitする方法を学びました。これでストリームの利用と生成の両方ができるようになりました。🎉

よくある質問

「async*でストリームを作成する」レッスンは無料ですか?

はい。「async*でストリームを作成する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Dart Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Dart Academyコースには全4レッスンが含まれています。

「async*でストリームを作成する」で何を学びますか?

ジェネレーターからイベントをyieldする ブラウザで直接実行するハンズオンコードでDart Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Dart Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDart Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「async*でストリームを作成する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDart Academyレッスンでコードを書いて実行できますか?

はい。すべてのDart Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. await forでリッスンする
  2. 単一購読ストリームとブロードキャストストリーム
  3. ストリームの変換:map、where、take
  4. async*でストリームを作成する
← Dart Academyに戻る