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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow