Dart Pro Tip: quando (non) utilizzare un Completer

Di - 12 September 2013 - in
Dart

In questo breve articolo vedremo un uso interessante degli oggetti Future in Dart — di cui abbiamo parlato più approfonditamente nell’articolo Funzioni asincrone ed oggetti Futures — che arriva direttamente dal blog di +Seth Ladd, Dart Dev Rel presso Google.

Se nel nostro programma abbiamo più Futures a catena — assumiamo di averne 2 — possiamo evitare di utilizzare un Completer all’interno del primo (come in questo esempio:)

Future doStuff() {
  Future future = someAsyncProcess();
  Completer completer = new Completer();

  future.then((msg) {
    bool result = msg.result as bool;

    completer.complete(result);
  });

  return completer.future;
}

ma utilizzare invece questa forma

Future doStuff() {
  return someAsyncProcess().then((msg) => msg.result);
}

In questo modo, considerando che l’ultimo Future in una catena può restituire un altro Future o un valore, la funzione chiamante “sa” quando il metodo finisce il lavoro asincrono e ha la possibilità di gestire correttamente potenziali errori.

Esistono tuttavia dei casi in cui è consigliabile utilizzare un Completer, ovvero in quei casi in cui una callback-based API (che non dispone di oggetti Future) deve comunicare con una Future-based API:

Future doStuff() {
  Completer completer = new Completer();
  runDatabaseQuery(sql, (results) {
    completer.complete(results);
  });
  return completer.future;
}

In questo esempio infatti l’oggetto completer funge da bridge fra runDatabaseQuery() (callback-based) e la funzione Future-based doStuff().

Via | Seth Ladd’s Blog

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall'Ottobre 2012.

Contatta l'autore

Previous post:

Next post: