dart
Programación Asíncrona
Buscar..
Devolviendo un futuro usando 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 y espera
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;
}
}
});
Vea el ejemplo en Dartpad: https://dartpad.dartlang.org/11d189b51e0f2680793ab3e16e53613c
Convertir devoluciones de llamada a futuros
Dart tiene una robusta biblioteca asíncrona, con Future , Stream y más. Sin embargo, a veces puede encontrarse con una API asíncrona que utiliza devoluciones de llamada en lugar de futuros . Para cerrar la brecha entre las devoluciones de llamada y los futuros, Dart ofrece la clase Completer . Puede utilizar un Completer para convertir una devolución de llamada en un futuro.
Los completadores son excelentes para enlazar una API basada en devolución de llamada con una API basada en futuro. Por ejemplo, suponga que el controlador de su base de datos no usa futuros, pero necesita devolver un futuro. Prueba este código:
// A good use of a Completer.
Future doStuff() {
Completer completer = new Completer();
runDatabaseQuery(sql, (results) {
completer.complete(results);
});
return completer.future;
}
Si está utilizando una API que ya devuelve un Futuro, no necesita usar un Completador.