【发布时间】:2021-12-20 17:36:02
【问题描述】:
例如,我有这个简单的代码:
//create stream with numbers from 1 to 100, delayed by 10sec duration
Stream<int> countStream() async* {
for (int i = 1; i <= 100; i++) {
yield i;
sleep(Duration(seconds: 10));
}
}
void main() async {
var x = await countStream().firstWhere((element) => element == 1); //here Im waiting for number 1
print(x);
}
问题是 firstWhere 不是在yield 1之后立即退出,而是在yield 2之后, 并保持打印 10 秒。
为什么?在我现实生活中的应用程序中,我有转换为消息流的 websocket 流,并等待特定消息。但是因为websocket流没有产生另一个消息,firstWhere挂了。
这是我的原始代码:
Stream<Message> lines() async* {
var partial = '';
await for (String chunk in ws!) { //ws is WebSocket
var lines = chunk.split('\n');
lines[0] = partial + lines[0];
partial = lines.removeLast();
for (final line in lines) {
var msg = Message.parse(line); //Message.parse returns CodeMessage object
if (msg != null) yield msg;
}
}
}
//at some place in code this hangs because last arrived message is CodeMessage
var msg = await lines().firstWhere((obj) => obj is CodeMessage);
print(msg);
还有其他方法可以做到这一点还是我错了?
【问题讨论】:
-
我会用
ws!.expand(...)或ws!.transform(...)替换您的async*生成器 - 请参阅 dart.dev/tutorials/language/streams#modify-stream-methods 了解更多信息
标签: flutter dart websocket async-await stream