| Index: pkg/polymer/lib/src/job.dart
|
| ===================================================================
|
| --- pkg/polymer/lib/src/job.dart (revision 37373)
|
| +++ pkg/polymer/lib/src/job.dart (working copy)
|
| @@ -4,43 +4,45 @@
|
|
|
| part of polymer;
|
|
|
| -/// Invoke [callback] in [wait], unless the job is re-registered,
|
| -/// which resets the timer. For example:
|
| -///
|
| -/// _myJob = runJob(_myJob, callback, const Duration(milliseconds: 100));
|
| -///
|
| -/// Returns a job handle which can be used to re-register a job.
|
| -// Dart note: renamed to runJob to avoid conflict with instance member "job".
|
| -_Job _runJob(_Job job, void callback(), Duration wait) {
|
| - if (job != null) {
|
| - job.stop();
|
| - } else {
|
| - job = new _Job();
|
| - }
|
| - job.go(callback, wait);
|
| - return job;
|
| -}
|
| -
|
| -// Public in Polymer.js but private as not sure it's the correct API for Dart.
|
| -// Switch to Timer when 14414 is addressed.
|
| -class _Job {
|
| +/// Like [Timer] but can be restarted, and if no duration is supplied uses
|
| +/// [window.requestAnimationFrame] instead of a 0-duration timer.
|
| +// TODO(jmesserly): need to find a better name here. Also this feels more like a
|
| +// system level API, but doesn't map exactly to any of our other primitives.
|
| +class PolymerJob {
|
| Function _callback;
|
| Timer _timer;
|
| + int _id; // for requestAnimationFrame
|
|
|
| - void go(void callback(), Duration wait) {
|
| - this._callback = callback;
|
| - _timer = new Timer(wait, complete);
|
| + PolymerJob._();
|
| +
|
| + bool get isScheduled => _timer != null || _id != null;
|
| +
|
| + /// Starts the job. If the job is already running, it will [stop] first.
|
| + void start(void callback(), [Duration wait]) {
|
| + stop();
|
| + _callback = callback;
|
| + if (wait == null) {
|
| + _id = window.requestAnimationFrame((_) => complete());
|
| + } else {
|
| + _timer = new Timer(wait, complete);
|
| + }
|
| }
|
|
|
| + /// Stops the job. It can be restarted by calling [start] with a new callback.
|
| void stop() {
|
| + if (_id != null) {
|
| + window.cancelAnimationFrame(_id);
|
| + _id = null;
|
| + }
|
| if (_timer != null) {
|
| _timer.cancel();
|
| _timer = null;
|
| }
|
| }
|
|
|
| + /// Synchronously completes the job.
|
| void complete() {
|
| - if (_timer != null) {
|
| + if (isScheduled) {
|
| stop();
|
| _callback();
|
| }
|
|
|