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()
(反之亦然)会有一个特别的好处。或者仅仅是我刚刚提到的那些好处?
答案 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 /下一个事件)。