| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'package:expect/expect.dart'; |
| import 'package:async_helper/async_helper.dart'; |
| |
| import 'dart:async'; |
| |
| var events = []; |
| var delayedValue = new Completer(); |
| var delayedError = new Completer(); |
| |
| foo() async { |
| // Because of this `await null` the function returns and lets the caller |
| // install handlers. When the function finishes, it can then synchronously |
| // propagate the values. |
| await null; |
| new Future.microtask(() => 'in microtask') |
| .then(events.add) |
| .then(delayedValue.complete); |
| return 'in async function'; |
| } |
| |
| bar() async { |
| // Because of this `await null` the function returns and lets the caller |
| // install handlers. When the function finishes, it can then synchronously |
| // propagate the values. |
| await null; |
| new Future<void>.microtask(() => throw 'in microtask error') |
| .catchError(events.add) |
| .then(delayedError.complete); |
| throw 'in async function error'; |
| } |
| |
| void main() { |
| asyncStart(); |
| var asyncValueFuture = foo().then(events.add); |
| var asyncErrorFuture = bar().catchError(events.add); |
| Future.wait(<Future>[ |
| asyncValueFuture, |
| delayedValue.future, |
| asyncErrorFuture, |
| delayedError.future |
| ]).then((_) { |
| // The body completed before nested microtask. So they should appear |
| // before the delayed functions. In other words, the async function should |
| // not unnecessarily delay the propagation of errors and values. |
| Expect.listEquals([ |
| "in async function", |
| "in async function error", |
| "in microtask", |
| "in microtask error" |
| ], events); |
| asyncEnd(); |
| }); |
| } |