How to use setInterval/setTimeout in Dart SDK 0.4+

2020-05-25 06:40发布

问题:

I realised that in current Dart SDK version 0.4.1.0_r19425 methods like setTimeout, setInterval, clearTimeout, clearInterval aren't part of Window class any more and they all moved to WorkerContext.
Is there any documentation on how to use them now? Do I need to create a new instance of WorkerContext every time I want to use them?

回答1:

In addition to Timer mentioned by Chris, there is a Future-based API:

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

There is not yet direct support for cancelling a Future callback, but this works pretty well:

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

Hopefully, there will soon be a Stream version of Timer.repeating as well.



回答2:

From this post on the group (Feb 14th 2013).

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

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

And another example (copied from the same post)

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

Specifically, they are now part of the Timer class in the dart:async library (rather than WorkerContext, which seems to be IndexedDb specific). API docs here



回答3:

You can use:

1) SetInterval

_timer = new Timer.periodic(const Duration(seconds: 2), functionBack);

Where: `functionBack(Timer timer) {
  print('again');
}

2) SetTimeOut

_timer = Timer(Duration(seconds: 5), () => print('done'));

Where _time is type Time