Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart.async; | 5 part of dart.async; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * A [Future] represents a delayed computation. It is used to obtain a not-yet | 8 * A [Future] represents a delayed computation. It is used to obtain a not-yet |
| 9 * available value, or error, sometime in the future. Receivers of a | 9 * available value, or error, sometime in the future. Receivers of a |
| 10 * [Future] can register callbacks that handle the value or error once it is | 10 * [Future] can register callbacks that handle the value or error once it is |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 * Similar to the synchronous code, the error handler (registered with | 77 * Similar to the synchronous code, the error handler (registered with |
| 78 * [catchError]) is handling the errors for exceptions coming from calls to | 78 * [catchError]) is handling the errors for exceptions coming from calls to |
| 79 * 'foo', as well as 'bar'. This would not be the case if the error-handler was | 79 * 'foo', as well as 'bar'. This would not be the case if the error-handler was |
| 80 * registered at the same time as the value-handler. | 80 * registered at the same time as the value-handler. |
| 81 * | 81 * |
| 82 * Futures can have more than one callback-pairs registered. Each successor is | 82 * Futures can have more than one callback-pairs registered. Each successor is |
| 83 * treated independently and is handled as if it was the only successor. | 83 * treated independently and is handled as if it was the only successor. |
| 84 */ | 84 */ |
| 85 // TODO(floitsch): document chaining. | 85 // TODO(floitsch): document chaining. |
| 86 abstract class Future<T> { | 86 abstract class Future<T> { |
| 87 | |
| 87 /** | 88 /** |
| 88 * Creates a future containing the result of calling [function]. | 89 * Creates a future containing the result of calling [computation] |
| 90 * asynchronously with [runAsync]. | |
| 89 * | 91 * |
| 90 * The result of computing [:function():] is either a returned value or | 92 * if the result of executing [computation] throws, the returned future is |
| 91 * a throw. | 93 * completed with the error. If a thrown value is an [AsyncError], it is used |
| 92 * | 94 * directly, instead of wrapping this error again in another [AsyncError]. |
| 93 * If a value is returned, it becomes the result of the created future. | |
| 94 * | |
| 95 * If calling [function] throws, the created [Future] will be completed | |
| 96 * with an async error containing the thrown value and a captured | |
| 97 * stacktrace. | |
| 98 * | |
| 99 * However, if the result of calling [function] is already an asynchronous | |
| 100 * result, we treat it specially. | |
| 101 * | 95 * |
| 102 * If the returned value is itself a [Future], completion of | 96 * If the returned value is itself a [Future], completion of |
| 103 * the created future will wait until the returned future completes, | 97 * the created future will wait until the returned future completes, |
| 104 * and will then complete with the same result. | 98 * and will then complete with the same result. |
| 105 * | 99 * |
| 106 * If a thrown value is an [AsyncError], it is used directly as the result | 100 * If a value is returned, it becomes the result of the created future. |
| 107 * of the created future. | |
| 108 */ | 101 */ |
| 109 factory Future.of(function()) { | 102 factory Future(computation()) { |
| 103 _ThenFuture<dynamic, T> future = | |
| 104 new _ThenFuture<dynamic, T>((_) => computation()); | |
|
Lasse Reichstein Nielsen
2013/04/15 10:27:46
I'd prefer using _FutureImpl directly instead of _
floitsch
2013/04/15 20:30:11
Falls under "optimizations for later" category.
| |
| 105 runAsync(() => future._sendValue(null)); | |
| 106 return future; | |
| 107 } | |
| 108 | |
| 109 /** | |
| 110 * Creates a future containing the result of immediately calling | |
| 111 * [computation]. | |
| 112 * | |
| 113 * if the result of executing [computation] throws, the returned future is | |
| 114 * completed with the error. If a thrown value is an [AsyncError], it is used | |
| 115 * directly, instead of wrapping this error again in another [AsyncError]. | |
| 116 * | |
| 117 * If the returned value is itself a [Future], completion of | |
| 118 * the created future will wait until the returned future completes, | |
| 119 * and will then complete with the same result. | |
| 120 * | |
| 121 * If a value is returned, it becomes the result of the created future. | |
| 122 */ | |
| 123 factory Future.sync(computation()) { | |
|
Lasse Reichstein Nielsen
2013/04/15 10:27:46
I prefer Future.of.
The "sync" name (apart from be
floitsch
2013/04/15 20:30:11
A lot of users got this confused and thought that
| |
| 110 try { | 124 try { |
| 111 var result = function(); | 125 var result = computation(); |
| 112 return new _FutureImpl<T>().._setOrChainValue(result); | 126 return new _FutureImpl<T>().._setOrChainValue(result); |
| 113 } catch (error, stackTrace) { | 127 } catch (error, stackTrace) { |
| 114 return new _FutureImpl<T>.immediateError(error, stackTrace); | 128 return new _FutureImpl<T>.immediateError(error, stackTrace); |
| 115 } | 129 } |
| 116 } | 130 } |
| 117 | 131 |
| 118 /** | 132 /** |
| 119 * A future whose value is available in the next event-loop iteration. | 133 * A future whose value is available in the next event-loop iteration. |
| 120 * | 134 * |
| 121 * If [value] is not a [Future], using this constructor is equivalent | 135 * If [value] is not a [Future], using this constructor is equivalent |
| 122 * to [:new Future.of(() => value):]. | 136 * to [:new Future.sync(() => value):]. |
| 123 * | 137 * |
| 124 * See [Completer] to create a Future and complete it later. | 138 * See [Completer] to create a Future and complete it later. |
| 125 */ | 139 */ |
| 126 factory Future.immediate(T value) => new _FutureImpl<T>.immediate(value); | 140 factory Future.value([T value]) => new _FutureImpl<T>.immediate(value); |
| 127 | 141 |
| 128 /** | 142 /** |
| 129 * A future that completes with an error in the next event-loop iteration. | 143 * A future that completes with an error in the next event-loop iteration. |
|
Anders Johnsen
2013/04/15 08:59:06
Write it's the same as new Future(() => throw new
Lasse Reichstein Nielsen
2013/04/15 10:27:46
I hope not. You should never throw an AsyncError (
floitsch
2013/04/15 20:30:11
AsyncError is gone.
| |
| 130 * | 144 * |
| 131 * See [Completer] to create a Future and complete it later. | 145 * See [Completer] to create a Future and complete it later. |
| 132 */ | 146 */ |
| 133 factory Future.immediateError(var error, [Object stackTrace]) { | 147 factory Future.error(var error, [Object stackTrace]) { |
| 134 return new _FutureImpl<T>.immediateError(error, stackTrace); | 148 return new _FutureImpl<T>.immediateError(error, stackTrace); |
| 135 } | 149 } |
| 136 | 150 |
| 137 /** | 151 /** |
| 138 * Creates a future that completes after a delay. | 152 * Creates a future that completes after a delay. |
| 139 * | 153 * |
| 140 * The future will be completed after the given [duration] has passed with | 154 * The future will be completed after the given [duration] has passed with |
| 141 * the result of calling [computation]. If the duration is 0 or less, it | 155 * the result of calling [computation]. If the duration is 0 or less, it |
| 142 * completes no sooner than in the next event-loop iteration. | 156 * completes no sooner than in the next event-loop iteration. |
| 143 * | 157 * |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 180 * completes when all elements have been processed. | 194 * completes when all elements have been processed. |
| 181 * | 195 * |
| 182 * The return values of all [Future]s are discarded. Any errors will cause the | 196 * The return values of all [Future]s are discarded. Any errors will cause the |
| 183 * iteration to stop and will be piped through the returned [Future]. | 197 * iteration to stop and will be piped through the returned [Future]. |
| 184 */ | 198 */ |
| 185 static Future forEach(Iterable input, Future f(element)) { | 199 static Future forEach(Iterable input, Future f(element)) { |
| 186 _FutureImpl doneSignal = new _FutureImpl(); | 200 _FutureImpl doneSignal = new _FutureImpl(); |
| 187 Iterator iterator = input.iterator; | 201 Iterator iterator = input.iterator; |
| 188 void nextElement(_) { | 202 void nextElement(_) { |
| 189 if (iterator.moveNext()) { | 203 if (iterator.moveNext()) { |
| 190 new Future.of(() => f(iterator.current)) | 204 new Future.sync(() => f(iterator.current)) |
| 191 .then(nextElement, onError: doneSignal._setError); | 205 .then(nextElement, onError: doneSignal._setError); |
| 192 } else { | 206 } else { |
| 193 doneSignal._setValue(null); | 207 doneSignal._setValue(null); |
| 194 } | 208 } |
| 195 } | 209 } |
| 196 nextElement(null); | 210 nextElement(null); |
| 197 return doneSignal; | 211 return doneSignal; |
| 198 } | 212 } |
| 199 | 213 |
| 200 /** | 214 /** |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 359 * Otherwise the [exception] and an optional [stackTrace] is combined into an | 373 * Otherwise the [exception] and an optional [stackTrace] is combined into an |
| 360 * [AsyncError] and sent to this future's listeners. | 374 * [AsyncError] and sent to this future's listeners. |
| 361 */ | 375 */ |
| 362 void completeError(Object exception, [Object stackTrace]); | 376 void completeError(Object exception, [Object stackTrace]); |
| 363 | 377 |
| 364 /** | 378 /** |
| 365 * Whether the future has been completed. | 379 * Whether the future has been completed. |
| 366 */ | 380 */ |
| 367 bool get isCompleted; | 381 bool get isCompleted; |
| 368 } | 382 } |
| OLD | NEW |