blob: 3797a927497622586a993cfbd59f82cbb3c1e8a4 [file] [log] [blame]
// 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.
// @dart = 2.9
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.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();
});
}