[英]Dart async/await internals
我正在寻找async/await
实现的来源。
我想知道它们是如何真正工作的,以便入侵future.then()
来检测是否存在等待执行的代码。
编辑
这是我愿意完成的事情:
TrackingCompleter completer = new TrackingCompleter();
TrackingFuture future = completer.future;
print("isAwaited: ${future.isAwaited} (F)");
new Future.delayed(new Duration(milliseconds: 500), () {
future.then((_) {
print("executing sorping");
print("isThenExecuted: ${future.thenExecuted} (F)");
new Future.delayed(new Duration(milliseconds: 500), () {
print("isThenExecuted: ${future.thenExecuted} (T)");
exit(1);
});
});
print("isAwaited: ${future.isAwaited} (T)");
print("isThenExecuted: ${future.thenExecuted} (F)");
completer.complete();
});
到目前为止,这是有效的。 我现在要做的是检测是否在代码中手动调用future.then
或使用await
语句自动调用future.then
。
异步/等待实现基于期货。 基本上, await
创建一个包含当前函数的其余部分的函数(await表达式的“continuation”), then
在将来等待该函数作为参数调用。 处理错误需要更多细节,但基本上就是这样。
在你的情况下,如果你想知道future.then
是否被调用,我建议只包装那个特定的未来。 例:
import "package:async/async.dart";
class ThenWrapper<T> extends DelegatingFuture<T> {
void Function(S Function(T), S Function(Object, StackTrace)) _callback;
ThenWrapper(Future<T> future, this._callback): super(future);
Future<S> then<S>(S onValue(T), {S onError(error, StackTrace st)}) {
_callback(onValue, onError);
return super.super(onValue, onError);
}
}
...
TrackingFuture future = new ThenWrapper(completer.future, ...);
您可以更改回调以执行任何操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.