使用Futures时.then()和.whenCompleted()方法之间的区别?

时间:2019-03-27 15:43:02

标签: dart

我正在探索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是什么?

谢谢!

3 个答案:

答案 0 :(得分:3)

.whenComplete将在Future完成错误时触发一个函数,或者.then在Future完成而没有错误之后触发一个函数。

引用.whenComplete API DOC

  

这是“最终”块的异步等效项。

答案 1 :(得分:3)

即使有错误,只要指定了thencatchError仍然可以调用

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的详细信息

whenComplete then