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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- await forでリッスンする
- 単一購読ストリームとブロードキャストストリーム
- ストリームの変換:map、where、take
- async*でストリームを作成する