用async / await替换Future.then()

时间:2019-01-18 04:08:42

标签: dart async-await flutter

我一直认为,与Futures API相比,异步/等待更加优雅/性感,但是现在我面临的情况是,未来API的实现非常简短,异步/等待替代方案显得冗长和丑陋。

我在评论中标记了我的两个问题#1和#2:

class ItemsRepository
{
  Future<dynamic> item_int2string;

  ItemsRepository() {
    // #1
    item_int2string = 
     rootBundle.loadString('assets/data/item_int2string.json').then(jsonDecode);
  }

  Future<String> getItem(String id) async {
    // #2
    return await item_int2string[id];
  }
}

#1:如何在此处使用async / await而不是Future.then()?什么是最优雅的解决方案?

#2:如果多次调用该方法,效率高吗?等待增加多少开销?我是否应该将已解决的将来作为实例变量,也称为

completedFuture ??= await item_int2string;
return completedFuture[id];

2 个答案:

答案 0 :(得分:2)

  

1:如何在此处使用async / await代替Future.then()?什么是最优雅的解决方案?

异步方法具有传染性。这意味着您的ItemsRepository方法必须异步才能在内部使用await。这也意味着您必须从其他地方异步调用它。参见示例:

Future<dynamic> ItemsRepository() async {
    // #1
    myString = await rootBundle.loadString('assets/data/item_int2string.json');
    // do something with my string here, which is not in a Future anymore...
  }

请注意,使用.then绝对与异步函数中的await相同。它只是语法糖。请注意,尽管如此,您使用.then的方式与示例不同:

  ItemsRepository() {
    // #1

     rootBundle.loadString('assets/data/item_int2string.json').then((String myString) {
       // do something with myString here, which is not in a Future anymore...
     });
  }

对于#2,不必担心异步代码对性能的影响。该代码将以与同步代码相同的速度执行,仅在稍后发生回调时才执行。存在异步的唯一原因是为了有一种简单的方法来允许代码在系统等待异步调用的部分返回时继续运行。例如,在等待磁盘加载文件时不阻止UI。

我建议您阅读basic docs about async in Dart

答案 1 :(得分:0)

thenawait不同。 await将在此处停止程序,直到完成Future任务。但是then不会阻止程序。 then任务之后完成后,将执行Future中的块。

如果您希望程序等待Future任务,请使用await。如果您希望程序继续运行并且Future任务是在“后台”执行操作,请使用then