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调查事件队列,以获取有关挂起任务的信息。我编辑了该问题,以添加我的意图的详细信息