6

如果我有以下代码:

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 死了什么?或者还有哪些期货?

4

2 回答 2

7

通过运行它来确定打印的内容非常容易(你手边没有 Dart 虚拟机吗?):

一个
C
AsyncError:“错误!”

Future.wait()的文档说:

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

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

e.error是用 ( 'Error!',在这种情况下) 创建的值,因此通过将其设置为指示哪个 Future 有错误的值,您可以看到哪个 Future “死亡”。当然,如果您不是造成错误的人,那也无济于事。

一般来说,我认为Future.wait()当其中任何一个错误将被类似处理时,您可以在这样的列表上使用。需要知道哪个失败可能表明您不想将wait()所有这些都放在一起。

更新:我刚刚意识到问题标题提出了问题正文中未提出的问题:其他期货会发生什么?

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

于 2013-04-15T19:08:14.217 回答
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

这告诉我们原来的错误是一个字符串。我不知道这对你有多大用处,但它的东西。

于 2013-04-15T19:12:45.020 回答