2013-03-08 8 views
9

Ich erkannte, dass in der aktuellen Dart SDK Version 0.4.1.0_r19425 Methoden wie setTimeout, setInterval, clearTimeout, clearInterval sind nicht Teil der Window Klasse mehr und sie alle bewegt WorkerContext verwenden .
Gibt es Dokumentation, wie man sie jetzt benutzt? Muss ich jedes Mal eine neue Instanz von WorkerContext erstellen, wenn ich sie verwenden möchte?Wie setInterval/SetTimeout in Dart SDK 0.4+

Antwort

15

Neben Timer von Chris erwähnt, gibt es eine Future-based API:

var future = new Future.delayed(const Duration(milliseconds: 10), doStuffCallback); 

Es ist noch nicht die direkte Unterstützung für eine Zukunft Rückruf Cancelling, aber das funktioniert ziemlich gut:

var future = new Future.delayed(const Duration(milliseconds: 10)); 
var subscription = future.asStream().listen(doStuffCallback); 
// ... 
subscription.cancel(); 

Hoffentlich gibt es bald auch eine Stream version of Timer.repeating.

+0

Also, wenn ich es richtig verstehe, ist die Verwendung von Future der empfohlene Weg. – martin

7

Von diesem post on the group (14. Februar 2013).

// Old Version 
window.setTimeout(() { doStuff(); }, 0); 

// New Version 
import 'dart:async'; 
Timer.run(doStuffCallback); 

Und ein weiteres Beispiel (aus dem gleichen Post kopiert)

// 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(); 

Insbesondere sind sie nun Teil der Timer Klasse in der dart:async Bibliothek (statt WorkerContext, die IndexedDB spezifisch zu sein scheint) . API docs here

+3

Ich warne vor der Verwendung von Timer, es sei denn, Sie setzen try/catch in Timer. Wenn eine Ausnahme innerhalb des Timers ausgelöst wird und Sie sie nicht abfangen, wird das Spiel beendet und die App wird beendet. Sie möchten wahrscheinlich Future.delayed verwenden, das nicht nur Ausnahmen korrekt abfängt, sondern Ihnen auch einen Überblick gibt, wann es tatsächlich fertig ist. Futures komponieren auch besser. –