Future
和Completer
有什么区别?
我都不在寻找任何文档部分,而是希望看到一个显示两者之间真正区别的示例。
答案 0 :(得分:4)
Completer
是用于从头开始创建Future
的类。因此,除非您真的是从头开始创建Future
,否则可能不应该使用Completer
。
您可以使用Completer
的构造函数来创建Future而不使用Future
:
final myFuture = Future(() {
final result = doSomethingThatTakesTime();
return result;
});
使用Future.then()
是获取Future
的另一种方法:
Future<bool> fileContainsBear(String path) {
return File(path).readAsString().then((contents) {
return contents.contains('bear');
});
}
任何async
/ await
方法都将返回Future:
Future<bool> fileContainsBear(String path) async {
var contents = await File(path).readAsString();
return contents.contains('bear');
}
以上所有方法都推荐使用Completer
:
// This is harder to read.
Future<bool> fileContainsBear(String path) {
var completer = Completer<bool>();
File(path).readAsString().then((contents) {
completer.complete(contents.contains('bear'));
});
return completer.future;
}
但是,如果您确实确实需要使用Completer,则完成方式如下:
Completer
。future
。这里是一个例子:
class AsyncOperation {
Completer _completer = new Completer();
Future<T> doOperation() {
_startOperation();
return _completer.future; // Send future object back to client.
}
// Something calls this when the value is ready.
void _finishOperation(T result) {
_completer.complete(result);
}
// If something goes wrong, call this.
void _errorHappened(error) {
_completer.completeError(error);
}
}
此答案中的代码来自documentation和Effective Dart guide。
答案 1 :(得分:0)
Completer是用于创建Future的辅助类,而Future是一种类型。
所有异步函数都返回Future,但是使用Completer可以创建也返回Future的同步函数。您也可以将同步功能与then
等链接起来。
Completer对象是一种处理过程,它无法重新启动。它完成工作并停止。
Future<MyObject> myMethod() {
final completer = Completer();
completer.complete(MyObject());
return completer.future;
}