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发生异常

 

 

 

posted @ 2019-10-15 17:24  野猿新一  阅读(43)  评论(0编辑  收藏  举报