我正在探索Dart中的Futures,我对Future提供的这两种方法感到困惑。它们之间的主要区别是什么?
让我们说我想使用.readAsString()
读取.txt,我会这样做:
void main(){
File file = new File('text.txt');
Future content = file.readAsString();
content.then((data) {
print(content);
});
}
.then()
就像一个回调,一旦Future完成,它就会触发一个函数。
但是我看到还有.whenComplete()
也可以在Future完成后触发功能。像这样:
void main(){
File file = new File('text.txt');
Future content = file.readAsString();
content.whenComplete(() {
print("Completed");
});
}
我在这里看到的区别是.then()
可以访问返回的数据!
.whenCompleted()
的作用是什么?什么时候选择一个?
在页面末尾的.then()和.whenCompleted()这两个链接上也有实现:
.then():
Future<R> then<R>(FutureOr<R> onValue(T value), {Function onError});
.whenCompleted():
Future<T> whenComplete(FutureOr action());
Future<R>
是什么意思?还是Future<T>
?我知道Future是一种类型,但是R和T是什么?
谢谢!
答案 0 :(得分:3)
.whenComplete将在Future完成错误时触发一个函数,或者.then在Future完成而没有错误之后触发一个函数。
引用.whenComplete API DOC
这是“最终”块的异步等效项。
答案 1 :(得分:3)
即使有错误,只要指定了then
,catchError
仍然可以调用。
someFuture.catchError(
(onError) {
print("called when there is an error catches error");
},
).then((value) {
print("called with value = null");
}).whenComplete(() {
print("called when future completes");
});
因此,如果发生错误,则会调用上述所有回调。
答案 2 :(得分:1)
.whenComplete
=当将来完成时,将调用.whenComplete
内部的函数,无论它是带值还是带错误。
.then
=返回一个新的Future,它通过调用onValue(如果这个Future完成并带有一个值)或onError(如果这个Future完成并带有错误)而完成
阅读有关API DOC的详细信息