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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow