dart
Programmation asynchrone
Recherche…
Retourner un avenir en utilisant un Completer
Future<Results> costlyQuery() {
var completer = new Completer();
database.query("SELECT * FROM giant_table", (results) {
// when complete
completer.complete(results);
}, (error) {
completer.completeException(error);
});
// this returns essentially immediately,
// before query is finished
return completer.future;
}
Async et attend
import 'dart:async';
Future main() async {
var value = await _waitForValue();
print("Here is the value: $value");
//since _waitForValue() returns immediately if you un it without await you won't get the result
var errorValue = "not finished yet";
_waitForValue();
print("Here is the error value: $value");// not finished yet
}
Future<int> _waitForValue() => new Future((){
var n = 100000000;
// Do some long process
for (var i = 1; i <= n; i++) {
// Print out progress:
if ([n / 2, n / 4, n / 10, n / 20].contains(i)) {
print("Not done yet...");
}
// Return value when done.
if (i == n) {
print("Done.");
return i;
}
}
});
Voir exemple sur Dartpad: https://dartpad.dartlang.org/11d189b51e0f2680793ab3e16e53613c
Conversion de rappels en contrats à terme
Dart possède une bibliothèque asynchrone robuste, avec Future , Stream , etc. Cependant, parfois , vous croiserez peut - être une API asynchrone qui utilise callbacks au lieu de contrats à terme. Pour combler le fossé entre les rappels et les contrats à terme, Dart propose la classe Completer . Vous pouvez utiliser un Completer pour convertir un rappel en Future.
Completers sont parfaits pour relier une API basée sur le rappel avec une API basée sur l'avenir. Par exemple, supposons que votre pilote de base de données n'utilise pas Futures, mais vous devez renvoyer un futur. Essayez ce code:
// A good use of a Completer.
Future doStuff() {
Completer completer = new Completer();
runDatabaseQuery(sql, (results) {
completer.complete(results);
});
return completer.future;
}
Si vous utilisez une API qui renvoie déjà un futur, vous n'avez pas besoin d'utiliser un Completer.