在Dart中,如果我将Future.wait与Futures列表一起使用并且其中一个期货出现错误,那么其他期货会发生什么?

时间:2013-04-15 18:48:08

标签: dart

如果我有以下代码:

Future<int> a = new Future(() { print('a'); return 1; });
Future<int> b = new Future.error('Error!');
Future<int> c = new Future(() { print('c'); return 3; });

Future.wait([a, b, c])
  .then((List<int> values) => print(values))
  .catchError((e) => print(e));

什么是印刷品?

catchError捕获的错误是否知道Future死了什么?或者哪个期货仍然存在?

2 个答案:

答案 0 :(得分:5)

通过运行来确定打印的内容非常简单(你没有方便的Dart VM吗?):

a
c
AsyncError: 'Error!'

documentation for Future.wait()说:

  

等待所有给定的期货完成并收集它们的价值。

     

返回一个未来,一旦列表中的所有期货完成,它将完成。如果列表中的任何期货以错误结束,则生成的未来也会因错误而完成。否则,返回的future的值将是生成的所有值的列表。

e.error是使用('Error!'创建的值,在本例中),因此通过将其设置为指示哪个Future有错误的内容,您可以看到哪个Future“已死”。当然,如果您不是创建错误的那个,那就无济于事了。

一般情况下,我认为您在列表中使用Future.wait()时,如果其中任何一个错误的处理方式类似。需要知道哪一个失败可能表示您不希望wait()同时放在一起。

更新:我刚刚意识到问题标题会在问题正文中提出一个问题:其他期货会怎样?

其他期货继续运行。 wait()返回的Future会在收到它时收到它收到的任何错误,因此所有返回值都会丢失,如果任何其他Futures抛出错误,则不会捕获,但每个Future仍会运行直到返回或抛出错误。

答案 1 :(得分:3)

AFAIK,你不会确切地知道哪个Future产生了错误。但是,您可以查询错误对象并获取一些有用的信息:

Future.wait([a, b, c])
.then((List<int> values) => print(values))
.catchError((e) {
  print(e.error);
  print(e.stackTrace);
  print(e.runtimeType);
  print(e.error.runtimeType);
});

运行此打印:

a
c
Error!
null
AsyncError
String

这告诉我们原始错误是一个String。我不知道这对你有多大帮助,但它有些东西。