2

考虑我有这样的代码:

import 'dart:async';

foo() {
  print('foo');
}

bar() {
  print('bar');
}

void main() {
  runZoned(() {
    new Timer(const Duration(seconds: 1), foo);
    new Timer(const Duration(seconds: 2), bar);
  });
}

我如何知道一个区域内的所有异步工作何时完成?也就是说,是否有可能知道在一个区域内注册的所有异步方法(通过计时器、未来等)何时完成?

4

2 回答 2

4

最初区域确实有一个“onDone”回调。(在此处查看旧测试中的用法)。然而,我们发现跟踪未完成的回调太难了。例如:future.then(callback)注册一个回调,但绝对不能保证这个回调会被调用。

事实上,期货永远不会完成是很常见的。区域本身对此做出了贡献:当错误源自具有错误处理程序的区域时,错误将永远不会离开该区域。这意味着该区域外的未来链将不会完成(既没有值也没有被区域拦截的错误)。

TL;DR:我们有onDone区域,但因为不切实际而将其删除。

于 2014-02-26T13:00:20.717 回答
0

我也试图找出这一点。
似乎异步队列没有在 Dart 中实现,而是由 VM 管理。
运行 Dart 代码的隔离会收到一条消息以运行注册的回调。

可以创建一个派生区域,对计划任务进行一些记账(在将调用提交到默认实现之前添加到自己的队列中,并包装回调以在回调被调用时得到通知,以将其从队列中删除)。

我希望有人提出更好的答案。

于 2014-02-26T08:20:19.213 回答