Future.of()与Timer中的Timer.run()的好处?

时间:2013-02-20 14:06:31

标签: timer dart future

Dart有许多创建,处理和返回异步函数的方法。最常见的方法之一是:

import 'dart:async';

var completer = new Completer();

// Previously this would have been new Timer(0, () => ....);
Timer.run(() => completer.complete(doSomethingHere()));
return completer.future;

然而,dart还直接为Future提供了构造函数,例如:

import 'dart:async';

return new Future.of(() => doSomethingHere());

我知道可以使用静态方法的返回值取消Timer.run()版本。并且new Future.of()版本的代码略少,使用new Future.of()优于Timer.run()(反之亦然)会有一个特别的好处。或者仅仅是我刚刚提到的那些好处?

2 个答案:

答案 0 :(得分:3)

Future.of返回Future,Timer.run不会返回任何内容。对我而言,这是主要的区别。

如果我想将值作为Future返回,我使用Future.of

如果我想稍后运行某个函数,我会使用Timer.run,而我并不关心它产生的值。

当运行该函数时,会有一个很大的区别。

对于Future.of,该函数在当前事件循环中运行,并且只有其在下一个事件循环中可用。

对于Timer.run,该函数在下一个事件循环中运行。

答案 1 :(得分:2)

不要忘记它们是两回事。 Timer可以在任何地方用于多种用途。例如,它可以在客户端用于等待布局在运行更多代码之前发生。所以,它可能与期货没有任何关系。我有时在客户端代码中使用计时器来等待布局。

Timer是一个用于延迟某些代码运行的泛型类。无论是否与期货有任何关系。另一个例子可能是客户端动画。与期货无关或以异步方式处理数据。

但是,期货是monad,它们可以帮助您编写异步程序。基本上是传递普通回调函数的替代。

在编写异步程序时使用new Future.of()并且它适合您的情况(与new Future.immediate()相同。

如果您想延迟某些代码的运行,请使用Timer类。

如果你想做的是使用期货进行异步编程并同时延迟代码,请忘记定时器类,除非你需要一些实际的延迟(超过0 /下一个事件)。