mi sono reso conto che nella versione attuale Dart SDK 0.4.1.0_r19425 metodi come setTimeout
, setInterval
, clearTimeout
, clearInterval
non fanno parte del Window
classe più e tutti hanno spostato in WorkerContext
.
C'è qualche documentazione su come usarli ora? Devo creare una nuova istanza di WorkerContext
ogni volta che voglio usarli?Come usare setInterval/setTimeout a Dart SDK 0.4+
risposta
Oltre a Timer citato da Chris, c'è un'API Future-based:
var future = new Future.delayed(const Duration(milliseconds: 10), doStuffCallback);
non v'è il supporto ancora diretta per annullare una richiamata futuro, ma questo funziona abbastanza bene:
var future = new Future.delayed(const Duration(milliseconds: 10));
var subscription = future.asStream().listen(doStuffCallback);
// ...
subscription.cancel();
Speriamo che presto ci sarà anche un Stream version of Timer.repeating.
Da questo post on the group (14 febbraio 2013).
// Old Version
window.setTimeout(() { doStuff(); }, 0);
// New Version
import 'dart:async';
Timer.run(doStuffCallback);
E un altro esempio (copiato partire dallo stesso posto)
// Old version:
var id = window.setTimeout(doStuffCallback, 10);
.... some time later....
window.clearTimeout(id);
id = window.setInterval(doStuffCallback, 1000);
window.clearInterval(id);
// New version:
var timer = new Timer(const Duration(milliseconds: 10), doStuffCallback);
... some time later ---
timer.cancel();
timer = new Timer.repeating(const Duration(seconds: 1), doStuffCallback);
timer.cancel();
In particolare, sono ormai parte della classe Timer
nella biblioteca dart:async
(piuttosto che WorkerContext
, che sembra essere IndexedDB specifico) . API docs here
Evito di usare il timer, a meno che non mettiate try/catch all'interno di Timer. Se viene lanciata un'eccezione all'interno di Timer e non la prendi, game over e app over. Probabilmente vorrai usare Future.delayed, che non solo cattura correttamente le eccezioni, ma ti dà anche una maniglia per sapere quando è effettivamente fatto. Anche i futures compongono meglio. –
Quindi, se ho capito bene, usare Future è il modo consigliato. – martin