我怎么知道我的代码何时在Dart中完成区域中的所有异步工作?

时间:2014-02-26 07:08:12

标签: dart dart-async

考虑我有这样的代码:

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);
  });
}

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

2 个答案:

答案 0 :(得分:4)

最初区域确实有一个" onDone"打回来。 (参见旧测试中的用法here)。然而,我们发现很难跟踪未完成的回调。例如:future.then(callback)注册一个回调,但绝对不能保证将调用此回调。

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

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

答案 1 :(得分:0)

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

有可能创建一个派生区域,对预定任务进行一些记录(在提交对默认实现的调用之前添加到自己的队列中,并且还包装回调以在调用回调时得到通知,以删除它从队列中。)

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