| Index: sdk/lib/async/future.dart
|
| diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
|
| index c5818251c498e0de4871ed55f07e0c1c903a1c14..7219719d944f713d878d11e54f0748016c9df709 100644
|
| --- a/sdk/lib/async/future.dart
|
| +++ b/sdk/lib/async/future.dart
|
| @@ -84,28 +84,43 @@ part of dart.async;
|
| */
|
| // TODO(floitsch): document chaining.
|
| abstract class Future<T> {
|
| +
|
| /**
|
| - * Creates a future containing the result of calling [function].
|
| + * Creates a future containing the result of calling [computation]
|
| + * asynchronously with [runAsync].
|
| *
|
| - * The result of computing [:function():] is either a returned value or
|
| - * a throw.
|
| + * if the result of executing [computation] throws, the returned future is
|
| + * completed with the error. If a thrown value is an [AsyncError], it is used
|
| + * directly, instead of wrapping this error again in another [AsyncError].
|
| *
|
| - * If a value is returned, it becomes the result of the created future.
|
| + * If the returned value is itself a [Future], completion of
|
| + * the created future will wait until the returned future completes,
|
| + * and will then complete with the same result.
|
| *
|
| - * If calling [function] throws, the created [Future] will be completed
|
| - * with an async error containing the thrown value and a captured
|
| - * stacktrace.
|
| + * If a value is returned, it becomes the result of the created future.
|
| + */
|
| + factory Future(computation()) {
|
| + _ThenFuture<dynamic, T> future =
|
| + new _ThenFuture<dynamic, T>((_) => computation());
|
| + runAsync(() => future._sendValue(null));
|
| + return future;
|
| + }
|
| +
|
| + /**
|
| + * Creates a future containing the result of immediately calling
|
| + * [computation].
|
| *
|
| - * However, if the result of calling [function] is already an asynchronous
|
| - * result, we treat it specially.
|
| + * if the result of executing [computation] throws, the returned future is
|
| + * completed with the error. If a thrown value is an [AsyncError], it is used
|
| + * directly, instead of wrapping this error again in another [AsyncError].
|
| *
|
| * If the returned value is itself a [Future], completion of
|
| * the created future will wait until the returned future completes,
|
| * and will then complete with the same result.
|
| */
|
| - factory Future.of(function()) {
|
| + factory Future.sync(computation()) {
|
| try {
|
| - var result = function();
|
| + var result = computation();
|
| return new _FutureImpl<T>().._setOrChainValue(result);
|
| } catch (error, stackTrace) {
|
| return new _FutureImpl<T>.immediateError(error, stackTrace);
|
| @@ -116,18 +131,18 @@ abstract class Future<T> {
|
| * A future whose value is available in the next event-loop iteration.
|
| *
|
| * If [value] is not a [Future], using this constructor is equivalent
|
| - * to [:new Future.of(() => value):].
|
| + * to [:new Future.sync(() => value):].
|
| *
|
| * See [Completer] to create a Future and complete it later.
|
| */
|
| - factory Future.immediate(T value) => new _FutureImpl<T>.immediate(value);
|
| + factory Future.value([T value]) => new _FutureImpl<T>.immediate(value);
|
|
|
| /**
|
| * A future that completes with an error in the next event-loop iteration.
|
| *
|
| * See [Completer] to create a Future and complete it later.
|
| */
|
| - factory Future.immediateError(var error, [Object stackTrace]) {
|
| + factory Future.error(var error, [Object stackTrace]) {
|
| return new _FutureImpl<T>.immediateError(error, stackTrace);
|
| }
|
|
|
| @@ -184,7 +199,7 @@ abstract class Future<T> {
|
| Iterator iterator = input.iterator;
|
| void nextElement(_) {
|
| if (iterator.moveNext()) {
|
| - new Future.of(() => f(iterator.current))
|
| + new Future.sync(() => f(iterator.current))
|
| .then(nextElement, onError: doneSignal._setError);
|
| } else {
|
| doneSignal._setValue(null);
|
|
|