async与await的在Flutter上的基本使用

lazihuman
发布于 2020-9-4 18:02
浏览
0收藏

异步编程通常用于网络请求,缓存的数据加载,本地文件图像加载,定时和延迟任务等。在Flutter开发中,使用async打开异步启动处理,并使用await等待处理结果,例如处理网络请求,代码如下

 

//代码清单 1-1
  //HTTP的get请求返回值为Future<String>类型,即其返回值未来是一个String类型的值
  //async关键字声明该函数内部有代码需要延迟执行
  Future<String> getData() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    return await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
  }


或者可以这样来写:

  //代码清单 1-2 
  Future<String> getData() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    //异步执行 1-2-1
    String  result = await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
     //异步执行 1-2-2
    String result2 = await http.get(Uri.encodeFull(url2), headers: {"Accept": "application/json"});
    return 
  }



在代码清单1-2中执行了两个异步任务,这两个异步任务是串行的,也就是异步 1-2-1 执行完毕后,获取到结果 result ,然后再开启异步执行 1-2-2,在实际项目可应用于使用第一个网络请求的结果来动态加载第二个网络请求或者是其他分类别的异步任务,代码清单1-2也可以拆分成如下代码清单1-3中的写法

  //代码清单 1-3
  Future<String> getData() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    //异步执行 1-2-1
    String  result = await getDataA();
    String result2 = await getDataB();
    return  Future.value(result2);
  }
 Future<String> getDataA() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    return await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
  }
    Future<String> getDataB() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    return await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
  }



然后对于代码清单1-3中异步处理getDataA()与getDataB()可以分别加入异常捕捉机制(如下代码清单1-4),以确保在异步处理之间不会相互影响,如在在这的异步处理getDataA()与getDataB(),如果getDataA()方法出现了异常,在Flutter中就会直接报错,而不再执行异步处理getDataB()。

//代码清单 1-4
  Future<String> getDataA() async {
    String result = "";
    try {
      return  await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
    } catch (e) {
      result = "出现异常";
    } finally {
      return Future.value(result);
    }
  }
    Future<String> getDataB() async {    
      String result = "";
        try {
          return  await http.get(Uri.encodeFull(url2), headers: {"Accept": "application/json"});
        } catch (e) {
          result = "出现异常";
        } finally {
          return Future.value(result);
        }
  }



串行调用 两个异步任务的一般写法如下代码清单1-5中所示

///代码清单 1-5
void test() async{
   await getDataA();
   await getDataB();
}



也可以用另一种方式来写如下代码清单1-6

///代码清单 1-6
  void test() async {
    getDataA().then((value1) {
      ///值value1就是getDataA中返回的结果
      getDataB().then((value2) {
        ///值value2就是getDataB中返回的结果
      });
    });
  }

作者:早起的年轻人
来源:掘金

分类
已于2020-9-4 18:02:13修改
收藏
回复
举报
回复
    相关推荐