blob: 941ca8097cfbc2ff9f45669d40e2180efa373fe7 [file] [log] [blame] [edit]
// 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/async_helper.dart';
import 'package:expect/expect.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();
});
}