在“m3”之前,您可以使用“completer.future.isComplete”检查 Future 是否已完成,这似乎已经消失了。有替代品吗?还是我需要自己保存它(似乎 _CompleterImpl 内部仍然有一个字段 '_isComplete' 但它没有暴露
问问题
5916 次
3 回答
9
使用 M3 Dart,最好只使用您自己的标志。
future.whenComplete(() {
tweenCompleted = true;
});
Dart 是一种单线程语言,因此这里没有竞争条件。请注意,当这个未来完成时,会调用 [action] 函数,无论它是使用值还是错误完成。
于 2013-01-25T22:04:54.177 回答
3
@Cutch的解决方案的替代方法是将Future
a包装起来Completer
:
Completer<T> wrapInCompleter<T>(Future<T> future) {
final completer = Completer<T>();
future.then(completer.complete).catchError(completer.completeError);
return completer;
}
Future<void> main() async {
final completer = wrapInCompleter(asyncComputation());
if (completer.isCompleted) {
final result = await completer.future;
// do your stuff
}
}
这种方法更有资源,因为您既可以异步等待完成,也可以检查未来是否同步完成。
于 2021-10-27T00:07:27.673 回答
1
使用 Future 的扩展并以 Hugo Passos 的回答为基础:
extension FutureExtension<T> on Future<T> {
/// Checks if the future has returned a value, using a Completer.
bool isCompleted() {
final completer = Completer<T>();
then(completer.complete).catchError(completer.completeError);
return completer.isCompleted;
}
}
于 2022-01-28T08:42:00.200 回答