dart
Асинхронное программирование
Поиск…
Возвращение будущего с помощью Завершающего
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 и Await
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;
}
}
});
См. Пример на Dartpad: https://dartpad.dartlang.org/11d189b51e0f2680793ab3e16e53613c
Преобразование обратных вызовов в фьючерсы
Дарт имеет надежную асинхронную библиотеку с Future , Stream и т. Д. Однако иногда вы можете запускать асинхронный API, который использует обратные вызовы вместо Futures . Чтобы устранить разрыв между обратными вызовами и фьючерсами, Дарт предлагает класс Completer . Вы можете использовать Completer для преобразования обратного вызова в Будущее.
Завершения отлично подходят для подключения API с поддержкой обратного вызова с использованием API на основе будущего. Например, предположим, что ваш драйвер базы данных не использует фьючерсы, но вам нужно вернуть будущее. Попробуйте этот код:
// A good use of a Completer.
Future doStuff() {
Completer completer = new Completer();
runDatabaseQuery(sql, (results) {
completer.complete(results);
});
return completer.future;
}
Если вы используете API, который уже возвращает будущее, вам не нужно использовать Completer.