繁体   English   中英

Dart async / await internals

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM