【问题标题】:Dart async/await internalsDart 异步/等待内部
【发布时间】:2017-12-07 23:55:39
【问题描述】:

我正在寻找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语句自动调用。

【问题讨论】:

  • AFAIK async/await 是编译器的一部分。代码被即时重写为future.then(),并且仅以这种形式执行。也许您可以使用 Observatory dart-lang.github.io/observatory 调查事件队列以获取有关待处理任务的信息

标签: dart


【解决方案1】:

async/await 实现基于期货。 基本上,await 创建一个包含当前函数的其余部分(await 表达式的“延续”)的函数,然后在您 await 的未来调用 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, ...);

你可以改变回调来做任何你想做的事情。

【讨论】:

  • 我编辑了问题以添加我的意图细节
猜你喜欢
  • 2017-12-11
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2018-12-24
  • 1970-01-01
  • 2021-10-22
  • 2023-03-10
相关资源
最近更新 更多