一,概述

在Dart1.9中加入了asyncawait关键字,有了这两个关键字,我们可以更简洁的编写异步代码,而不需要调用Future相关的API。他们允许你像写同步代码一样写异步代码和不需要使用Future接口。相当于都Future相关API接口的另一种封装,提供了一种更加简便的操作Future相关API的方法

将 async 关键字作为方法声明的后缀时,具有如下意义

  • 被修饰的方法会将一个 Future 对象作为返回值
  • 该方法会同步执行其中的方法的代码直到第一个 await 关键字,然后它暂停该方法其他部分的执行;
  • 一旦由 await 关键字引用的 Future 任务执行完成,await的下一行代码将立即执行。

二,Async/await 示例解析

  • 示例一:
    使用Async/await也是可以实现异步操作,下面直接上例子:

    main() {
    create();
    }
    void create(){
    String data = getData();
    print(data);
    print("I love Future");
    }
    getData() async{
    return await "I love Android";
    }

    运行上面代码,报错了:

    type 'Future<dynamic>' is not a subtype of type 'String'

    报的是类型不匹配?为什么呢?经过一番搜查,发现getData是一个异步操作函数,它的返回值是一个await延迟执行的结果。在Dart中,有await标记的运算,其结果值是一个Future对象,Future并不是String类型,就报错了。那么怎么才正确获得异步的结果呢?Dart规定async标记的函数,只能由await来调用,下面改成这样:

    main() {
    create();
    } void create() async{
    String data = await getData();
    print(data);
    print("I love Future");
    }
    getData() async{
    return await "I love Android";
    }

    下面直接去掉async函数包装,直接在getData方法里对data进行赋值:

    String data;
    main() {
    create();
    }
    void create(){
    getData();
    print("I love Future");
    }
    getData() async{
    data = await "I love Android";
    print(data);
    }

    上面输出结果是:

    I love Future
    I love Android

    可以发现,先输出的是I love Future后面再输出I love Android,可以发现当函数被async修饰时,会先去执行下面的操作,当下面的操作执行完,然后再执行被async修饰的方法。async用来表示函数是异步的,定义的函数会返回一个Future对象,await后面是一个Future,表示等待该异步任务完成,异步完成后才会往下走。要注意以下几点:

    1. await关键字必须在async函数内部使用,也就是加await不加async会报错。
    2. 调用async函数必须使用await关键字,如果加async不加await会顺序执行代码。
      PS: await 关键字真的很形象,等一等的意思,就是说,既然你运行的时候都要等一等,那我调用的时候也要等等吧。
  • 示例二:

    main() {
    _startMethod();
    _method_C(); } _startMethod() async{
    _method_A();
    await _method_B();
    print("start结束");
    }
    _method_A(){
    print("A开始执行这个方法~"); } _method_B() async {
    print("B开始执行这个方法~");
    await print("后面执行这句话~");
    print("继续执行这句哈11111~");
    } _method_C(){
    print("C开始");
    }

    结果如下:

    A开始执行这个方法~
    B开始执行这个方法~
    后面执行这句话~
    C开始
    继续执行这句哈11111~
    start结束

  过程分析:

    1. 当使用async作为方法名后缀声明时,说明这个方法的返回值是一个Future
    2. 当执行到该方法代码用await关键字标注时,会暂停该方法其他部分执行;
    3. await关键字引用的Future执行完成,下一行代码会立即执行。
也就是首先执行_startMethod这个方法用async声明了,因为方法里调用了_method_A,所以先输出print("A开始执行这个方法~");,后面执行_method_B(),这个方法用await关键字声明,所以会暂停print("start结束");的执行,然后继续执行_method_B()print("B开始执行这个方法~");输出,下一行遇到await关键字,会暂停其他代码的执行。当await关键字引用的Future执行完成(也就是执行print("后面执行这句话~"),_method_C()方法会立即执行,然后执行继续执行这句哈11111~,最后执行print("start结束"); 


 


【dart学习】-- Dart之async和await的更多相关文章

  1. C#异步编程学习笔记之-async和await(续)

    书接上文,本篇主要记录的内容要点:1.针对async和await在实际应用中的使用方式:2.异步方法返回值(有返回值和无返回值)的两种情况: 示例一(无返回值): using System; usin ...

  2. C#异步编程学习笔记之-async和await

    一.异步方法介绍(async和await):如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能.1.标记的异步方法可以使用await来指定暂停点.await运算符通知编译器异步方法: ...

  3. es6学习4:async和await

    async async函数返回一个 Promise 对象,可以使用then方法添加回调函数.当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句. funct ...

  4. 通过async与await实现高效并发

    withTimeoutOrNull: 在上一次https://www.cnblogs.com/webor2006/p/12010388.html中对于协程的超时机制进行了一个学习,上次用的是withT ...

  5. 【dart学习】-- Dart之异步编程

    一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...

  6. Dart 学习

    语言特性 Dart所有的东西都是对象, 即使是数字numbers.函数function.null也都是对象,所有的对象都继承自Object类. Dart动态类型语言, 尽量给变量定义一个类型,会更安全 ...

  7. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  8. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  9. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

随机推荐

  1. PCB下元器件重叠放置--Altium Designer

    这里指的是同层元件重叠,即在大的器件下放置小的器件:虽然程序设计规则默认同层元件重叠是错误的,但是在实际设计中,同层元件重叠却经常使用. 以Altium Designer9.0为例:不过好像规则里并没 ...

  2. 【SPOJ8222】Substrings (后缀自动机)

    题意: 给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值. 求F(1)..F(Length(S)) Length(S) <= 250000 思路:板子中st[x]定义为r ...

  3. delphi中如何将一整个文件读入内存

    来源 https://bbs.csdn.net/topics/390985048 分配一块大内存吧,要是一下申请不了64M那么大,就多申请几块小的,用个链表连起来.用FileStream类的方法读取文 ...

  4. 《Spring Cloud构建微服务架构》系列博文示例

    SpringCloud-Learning   源码下载地址:http://download.csdn.net/detail/k21325/9650968     本项目内容为Spring Cloud教 ...

  5. CSS基础知识复习

    1. CSS优先级 标签内部属性 style定义的CSS > 文档内定义的css > 引用外部CSS文件 2. CSS选择器类型 . 标签选择器 . 类选择器(使用.做标识) . ID选择 ...

  6. html&css面试笔记

    1.CSS选择器有哪些?它们的优先级是怎样的? 选择器类型: id选择器 ( # myid) 类选择器 (.myclassname) 标签选择器 (div, h1, p) 相邻选择器 (h1 + p) ...

  7. DCloud-MUI-JS:相关摘录

    ylbtech-DCloud-MUI-JS:相关摘录 1.返回顶部 1.JS initFun: function() { var oldBack = mui.back; mui.back = func ...

  8. 如何设置Windows操作系统打印机与xlpd连接

    Xlpd是Xmanager中负责远程打印的软件,除了打印远程文件,它还具备很多功能,本集将具体讲解Xlpd的主要功能. 主要功能如下: 1.  支持LPD协议(RFC1179) 在RFC1179中定义 ...

  9. Linux查看文件大小5个常用命令

    1. 前言 Linux 系统有非常好用的命令,功能也非常丰富,如果你对命令行工具熟悉,可以非常高效率完成维护工具.本文主要介绍Linux系统中,用于查看文件大小的命令. Linux 查看文件大小5个常 ...

  10. appium常见问题03_appium脚本报错selenium.common.exceptions.WebDriverException

    运行appium脚本时报错selenium.common.exceptions.WebDriverException...,如下截图: 该报错说明appium和app的内置chrome版本不一致 [解 ...