Поиск…


Возвращение будущего с помощью Завершающего

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.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow