2017-10-15 10 views
0

Dans Dart, je veux exécuter plusieurs fonctions coûteuses, indépendantes les unes des autres, et assigner les résultats à mes variables, en fonction de la fonction qui les a produites. Environ une version parallèle de celle-ci:Comment attribuer les résultats des contrats à terme en Dart en fonction du futur qui les a produits?

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

Je pense à quelque chose comme ceci:

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; 
    }); 
}); 

et je ne sais pas comment mettre en œuvre cette partie is produced by. Un moyen serait d'envelopper le résultat de chaque fonction dans une classe différente et, dans la partie then, vérifiez la classe du résultat:

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

mais cela semble très inélégante pour moi. Aucune suggestion?

+0

Comment saurons-nous lequel a produit le résultat? Est-ce que celui qui n'a pas produit le résultat est nul? Ou voulez-vous juste obtenir le premier résultat et ignorer le 2ème? –

Répondre

0

Merci à Randal j'ai trouvé une solution:

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

Non testé, mais je pense que j'ai compris. :)

Utilisez la fermeture:

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

Merci, c'était assez proche. Mais les éléments de liste doivent être Futures, pas seulement des fonctions. Voir ma réponse ci-dessous. –

0

Pour attendre Futures en parallèle, vous utilisez Future.wait, comme vous avez déjà remarqué. Les résultats de la liste renvoyée (de façon asynchrone) par Future.wait sont dans le même ordre que les contrats à terme d'origine, donc au lieu d'utiliser forEach vous pouvez simplement faire:

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

Bon à savoir, mais est-ce un hack ou une fonctionnalité? –

+0

Caractéristique. Je peux voir que ce n'est pas réellement documenté (doh!), Mais je peux vous promettre que c'est prévu pour fonctionner de cette façon. – lrn