dart
Asynkron programmering
Sök…
Återvända en framtid med en kompletterare
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 och vänta
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;
}
}
});
Se exempel på Dartpad: https://dartpad.dartlang.org/11d189b51e0f2680793ab3e16e53613c
Konvertera återuppringningar till Futures
Dart har ett robust async-bibliotek med Future , Stream och mer. Men ibland kan du stöta på ett asynkront API som använder återuppringningar i stället för Futures . För att överbrygga klyftan mellan återuppringningar och Futures erbjuder Dart klassen Completer . Du kan använda en kompletterare för att konvertera ett återuppringning till en framtid.
Kompletterare är bra för att överbrygga ett återuppringningsbaserat API med ett Framtidsbaserat API. Anta till exempel att din databasdrivrutin inte använder Futures, men du måste returnera en Future. Prova den här koden:
// A good use of a Completer.
Future doStuff() {
Completer completer = new Completer();
runDatabaseQuery(sql, (results) {
completer.complete(results);
});
return completer.future;
}
Om du använder ett API som redan returnerar en framtid behöver du inte använda en Kompletterare.