4

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()可以使用静态方法的返回值取消版本。并且该版本的代码略少,使用overnew Future.of()是否有特别的好处(反之亦然)。还是只是我刚才提到的那些好处?new Future.of()Timer.run()

4

2 回答 2

3

Future.of返回一个 Future,Timer.run不返回任何东西。对我来说,这是主要的区别。

Future.of如果我想将一个值作为 Future 返回,我会使用它。

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

不过,一个很大的区别是函数的运行时间。

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

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

于 2013-02-22T08:01:17.283 回答
2

不要忘记它们是两种不同的东西。Timer可以在任何地方用于多种用途。例如,它可以在客户端用于等待布局发生,然后再运行更多代码。因此,它可能与期货没有任何关系。我有时在客户端代码中使用计时器来等待布局。

Timer 是一个通用类,用于延迟某些代码的运行。不管它是否与期货有关。另一个例子可能是客户端动画。与期货或异步处理数据无关。

然而,Future 是帮助您编写异步程序的 monad。基本上是传递普通回调函数的替代品。

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

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

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

于 2013-02-20T20:42:31.983 回答