
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