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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow