2013-04-15 41 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 

這就告訴我們,原來的錯誤是一個字符串。我不知道這對你有多大用處,但它是有用的。