Dart异步/等待内部
我正在搜索Dart异步/等待内部,dart,Dart,我正在搜索async/await实现的源代码 我想知道它们是如何真正工作的,以便侵入future.then()以检测是否有代码等待执行 编辑 这是我愿意完成的: TrackingCompleter completer = new TrackingCompleter(); TrackingFuture future = completer.future; print("isAwaited: ${future.isAwaited} (F)"); new Future.delayed(new Dura
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();
});
到目前为止,这是可行的。我现在要做的是检测是否为未来。然后在代码中手动调用
,或使用等待
语句自动调用。
异步/等待实现基于未来。
基本上,await
创建一个包含当前函数其余部分的函数(await表达式的“continuation”),然后调用then
,以该函数作为参数对未来进行等待。
处理错误需要更多的细节,但基本上就是这样
在您的例子中,如果您想知道是否调用了future.then
,我建议您只包装这个特定的未来。例如:
导入“包:async/async.dart”;
类包装器扩展了DelegatingFuture{
void函数(S函数(T),S函数(对象,StackTrace))\u回调;
ThenWrapper(Future-Future,this.\u回调):super(Future);
Future then(S onValue(T),{S onError(error,StackTrace st)}){
_回调(onValue,onError);
返回super.super(onValue,onError);
}
}
...
TrackingFuture=newthenwrapper(completer.future,…);
您可以更改回调以执行任何操作。AFAIK async/await是编译器的一部分。代码将被动态重写到
future.then()
,然后仅以这种形式执行。也许您可以使用Observator调查事件队列,以获取有关挂起任务的信息。我编辑了该问题,以添加我的意图的详细信息