| Index: sdk/lib/async/future_impl.dart
|
| diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
|
| index 90e9df2b5033586837a245375526a067e24a7805..fb1280c52c1b5c540057cdab773e4dd29870f84b 100644
|
| --- a/sdk/lib/async/future_impl.dart
|
| +++ b/sdk/lib/async/future_impl.dart
|
| @@ -537,4 +537,37 @@ class _Future<T> implements Future<T> {
|
| source = listener;
|
| }
|
| }
|
| +
|
| + Future timeout(Duration timeLimit, [void onTimeout()]) {
|
| + if (_isComplete) return new _Future.immediate(this);
|
| + _Future result = new _Future();
|
| + Timer timer;
|
| + if (onTimeout == null) {
|
| + timer = new Timer(timeLimit, () {
|
| + result._completeError(new TimeoutException(timeLimit));
|
| + });
|
| + } else {
|
| + Zone zone = Zone.current;
|
| + onTimeout = zone.registerCallback(onTimeout);
|
| + timer = new Timer(timeLimit, () {
|
| + try {
|
| + result._complete(zone.run(onTimeout));
|
| + } catch (e, s) {
|
| + result._completeError(e, s);
|
| + }
|
| + });
|
| + }
|
| + this.then((T v) {
|
| + if (timer.isActive) {
|
| + timer.cancel();
|
| + result._complete(v);
|
| + }
|
| + }, onError: (e, s) {
|
| + if (timer.isActive) {
|
| + timer.cancel();
|
| + result._completeError(e, s);
|
| + }
|
| + });
|
| + return result;
|
| + }
|
| }
|
|
|