co<T> function
used to invoke async functions in order
Implementation
Future<T> co<T>(key, FutureOr<T> action()) async {
for (;;) {
final c = _locks[key];
if (c == null) break;
try {
await c.future;
} catch (_) {} //ignore error (so it will continue)
}
final c = _locks[key] = new Completer<T>();
void then(T result) {
final c2 = _locks.remove(key);
c.complete(result);
assert(identical(c, c2));
}
void catchError(ex, StackTrace st) {
final c2 = _locks.remove(key);
c.completeError(ex, st);
assert(identical(c, c2));
}
try {
final result = action();
if (result is Future<T>) {
result.then(then).catchError(catchError);
} else {
then(result);
}
} catch (ex, st) {
catchError(ex, st);
}
return c.future;
}