Dart Streamクラスのtimeout()メソッドについてメモ書き。
timeout()はStreamイベントのタイムアウトを制御するメソッド。
第1引数はタイムアウト値。Durationを使って値を指定する。
第2引数は名前付きオプション引数の「onTimeout:()」でタイムアウト発生時の処理を記述する。
onTimeout:()は引数としてEventSinkを受け取る。EventSinkはパイプの役割を果たし、EventSinkを使って受信したStreamイベントを制御する。
onTimeout:()を省略した場合、TimeoutExceptionが返される。
タイムアウトのカウントはリッスンを開始した時に始まる。
ブロードキャストを受け取った場合、返すStreamはブロードキャストとなる。ブロードキャストの場合は各リスナー毎に個別のタイマーを持つ。
コーディングで動作確認。
タイムアウト値は1秒で設定。i==5の時2秒待ちを発生させる。
void main() {
final stream = () async* {
for (int i = 0; i < 10; i++) {
if (i == 5) {
await Future.delayed(Duration(seconds: 2));
}
yield i;
}
}();
stream.timeout(const Duration(seconds: 1)).listen(print);
}
実行結果。
onTimeout:()を指定していないので、TimeoutExceptionが返される。
0
1
2
3
4
Unhandled exception:
TimeoutException after 0:00:01.000000: No stream event
次にonTimeout:()でタイムアウト発生時の処理を記述する。
void main() {
final stream = () async* {
for (int i = 0; i < 10; i++) {
if (i == 5) {
await Future.delayed(Duration(seconds: 2));
}
yield i;
}
}();
stream.timeout(
const Duration(seconds: 1),
onTimeout: (sink) {
print("Timeout");
// EventSinkのclose()メソッドでStreamを停止
sink.close();
},
).listen(print);
}
実行結果。
EventSinkのclose()メソッドを使いStreamを停止している。
0
1
2
3
4
Timeout
最後はEventSinkでStreamを制御しなかった場合の動作を確認。
void main() {
final stream = () async* {
for (int i = 0; i < 10; i++) {
if (i == 5) {
await Future.delayed(Duration(seconds: 2));
}
yield i;
}
}();
stream.timeout(
const Duration(seconds: 1),
onTimeout: (sink) {
print("Timeout");
},
).listen(print);
}
実行結果。
0
1
2
3
4
Timeout
5
6
7
8
9
コメント