如何 return Dart 中的 Stream 而无需循环
How to return a Stream in Dart without looping through it
我的代码中有一个 Stream,我对其进行了一些修改/转换。我想 return 该流作为我的函数的结果。
此代码有效:
Stream<int> returnStream2() async* {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
await for( var i in result ) {
yield i;
}
}
为什么这个更简单、更易读的版本不起作用?
Stream<int> returnStream1() async* {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
return result;
}
我收到一条错误消息“无法 return 来自生成器函数的值(使用 'async*' 修饰符)
我刚刚发现了 yield* 关键字,它解决了我的问题:
Stream<int> returnStream1() async* {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
yield* result;
}
要么像您已经发现的那样使用 yield*
,要么就不要将函数设为 async*
函数。如果这个流是你唯一产生的东西,你可以这样做:
Stream<int> returnStream1() {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
return result;
}
如果你做其他事情,那么yield* stream;
或await for (var event in stream) yield event;
都是选项(它们在处理来自流的错误事件的方式上有所不同,但对于普通数据事件,两者应该是等价的) .
我的代码中有一个 Stream,我对其进行了一些修改/转换。我想 return 该流作为我的函数的结果。
此代码有效:
Stream<int> returnStream2() async* {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
await for( var i in result ) {
yield i;
}
}
为什么这个更简单、更易读的版本不起作用?
Stream<int> returnStream1() async* {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
return result;
}
我收到一条错误消息“无法 return 来自生成器函数的值(使用 'async*' 修饰符)
我刚刚发现了 yield* 关键字,它解决了我的问题:
Stream<int> returnStream1() async* {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
yield* result;
}
要么像您已经发现的那样使用 yield*
,要么就不要将函数设为 async*
函数。如果这个流是你唯一产生的东西,你可以这样做:
Stream<int> returnStream1() {
var list = <int>[1,2,3];
var result = Stream<int>.fromIterable(list);
return result;
}
如果你做其他事情,那么yield* stream;
或await for (var event in stream) yield event;
都是选项(它们在处理来自流的错误事件的方式上有所不同,但对于普通数据事件,两者应该是等价的) .