2017-10-15 155 views
0

在Dart中,我想運行幾個相互獨立的代價高昂的函數,並將結果分配給我的變量,具體取決於哪個函數產生了它們。大致並行版本的這個:如何根據未來生產的飛鏢分配飛鏢中的期貨結果?

double x = getX(); 
double y = getY(); 

我在想是這樣的:

double x, y; 
Future.wait([ 
    futureGetX(), 
    futureGetY() 
]).then((List results) { 
    results.foreach((r) { 
    // if(r is produced by futureGetX) x = r; 
    // if(r is produced by futureGetY) y = r; 
    }); 
}); 

,我不知道如何實現這個is produced by部分。一個方法是將包裝每個函數的結果在不同的類,在then部分,檢查類結果:

if(r is wrapperForX) x = r.getValue(); 
if(r is wrapperForY) y = r.getValue(); 

但這似乎非常不雅給我。有什麼建議麼?

+0

我們如何知道哪一個產生了結果?沒有產生結果的那個返回null嗎?或者你只想得到第一個結果而忽略第二個結果? –

回答

0

感謝蘭德爾我找到了一個解決方案:

Future.wait([ 
() async { x = await futureGetX(); }(), 
() async { y = await futureGetY(); }() 
]); 
1

未經測試,但我想我得到了這個。 :)

使用閉:

Future.wait([ 
() => { x = await futureGetX()}, 
() => { y = await futureGetY()}, 
]); 
+0

謝謝,這已經足夠接近了。但是列表元素需要的是期貨,而不僅僅是函數。請參閱下面的答案。 –

0

要等待並行期貨,您使用Future.wait,因爲你已經注意到了。 列表返回的結果(異步)由Future.wait是因爲原來的期貨相同的順序,所以不是使用forEach你可以這樣做:

x = results[0]; 
y = results[1]; 
+0

很高興知道,但它是一種黑客或功能? –

+0

功能。我可以看到它沒有實際記錄(doh!),但我可以向你保證,它的目的是以這種方式工作。 – lrn