Dart异步编程之Stream.fromFutures使用详解
假设我们有多个异步任务要一起执行,我们可以分别执行它们,然后分别设置回调处理它们的处理结果或者异常信息
我们还可以用Stream.fromFutures把它们放在一起执行,然后统一监听它们的处理结果或者异常信息,每当一个异步任务结束时都会回调一次处理结果的回调,当某个任务发生异常时会也会回调一次处理异常的回调,且其他任务照常执行不会被中断。
使用Stream.fromFutures还有一个好处就是当所有异步任务都结束时(不管成功与否),会回调onDone参数设置的回调
void main() {
Stream.fromFutures([
Future.delayed(Duration(seconds: 1), () {
return "Hello";
}),
Future.delayed(Duration(seconds: 2),(){
return "World";
}),
Future.delayed(Duration(seconds: 3),(){
throw AssertionError("Error");
}),
Future.delayed(Duration(seconds: 3), () {
return "野猿新一";
})
]).listen((data){
print(data); // 每当一个异步任务成功执行完会回调一次
}, onError: (e){
print(e.message); // 每当一个异步任务发生异常会回调一次
},onDone: (){
print("onDone"); // 虽有异步任务都结束时回调
});
}
执行结果如下
Hello
World
Error
野猿新一
onDone
与Future.wait的区别
在Dart异步编程之Future使用详解这篇文章中我们有介绍了Future.wait的使用,它与Stream.fromFutures的区别是要等所有异步任务都成功后才会走到成功的回调,而且若其中某个任务发生异常,就会走到异常的回调而不会走成功的回调
如下代码,所有任务执行成功的情况
void main() {
Future.wait([
Future.delayed(Duration(seconds: 1), () {
print('任务1执行中...');
return "Hello";
}),
Future.delayed(Duration(seconds: 2),(){
print('任务2执行中...');
return "World";
}),
Future.delayed(Duration(seconds: 3), () {
print('任务3执行中...');
return "野猿新一";
})
]).then((results){
print('所有任务执行完:' + results[0] + ' ' + results[1] + ' ' + results[2] );
}).catchError((e){
print(e.message);
});
}
执行结果如下
任务1执行中...
任务2执行中...
任务3执行中...
所有任务执行完:Hello World 野猿新一
中间某个任务执行失败,抛出异常的情况
void main() {
Future.wait([
Future.delayed(Duration(seconds: 1), () {
print('任务1执行中...');
return "Hello";
}),
Future.delayed(Duration(seconds: 2),(){
throw AssertionError('任务2发生异常');
}),
Future.delayed(Duration(seconds: 3), () {
print('任务3执行中...');
return "野猿新一";
})
]).then((results){
print('所有任务执行完:' + results[0] + ' ' + results[1] + ' ' + results[2] );
}).catchError((e){
print('catchError:' + e.message);
});
}
执行结果如下,可以看到,当某个任务(任务2)发生异常时,并不会马上回调错误的回调,而是等其他任务(任务3)都执行完才走错误的回调
任务1执行中...
任务3执行中...
catchError:任务2发生异常