2013-04-15 42 views
3

如果我有以下代码:在Dart中,如果我使用Future.wait和期货清单,并且其中一个期货发生错误,那么其他期货会发生什么?

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的死亡有所了解?或者期货依然存在?

+1

我在一段时间看过的最佳问题标题。 –

回答

5

确定打印什么是运行它很容易(你没有一个飞镖VM方便?):

 
a 
c 
AsyncError: 'Error!' 

documentation for Future.wait()说:

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

返回一旦列表中的所有期货都完成,即可完成的未来。如果列表中的任何一个期货完成了一个错误,那么产生的未来也完成了一个错误。否则,返回的未来的价值将是所有产生的价值清单。

e.error是与创建('Error!',在这种情况下)的值,所以通过设置的东西表明其未来有错误,你可以看到它未来的“死亡”。当然,如果你不是那个造成错误的人,那也没用。

一般来说,我认为你在像这样的List上使用Future.wait()时,其中的任何一个中的错误将被类似地处理。需要知道哪一个失败可能是您不希望将wait()全部放在一起的标志。

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

其他期货继续运行。由wait()返回的未来将返回它接收到的所有错误,因此所有返回值都将丢失,并且如果其他期货中的任何一方抛出错误,则不会被捕获,但每个未来都会一直运行,直到返回或抛出一个错误。

+0

我想真正的问题是:其他期货的副作用是否仍然存在?答:是的。 –

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 

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