浅析Dart语言的异步处理

 更新时间:2023年06月29日 11:36:32   作者:97令山  
Dart是一个单线程语言,我们在处理耗时操作的时候使用stream或者future来实现,在这篇文章中我们将简单的给大家聊一聊Dart语言的异步处理

何为异步支持

了解一下异步线程

  • 为何有异步?
    • Dart是单线程语言,当其遇到有延迟的运算(比如IO操作、延时执行)时,线程中按顺序执行的运算就会阻塞,用户就会感觉到卡顿,因此通常用异步处理来解决线程阻塞问题。
  • Dart单线程模型
    • Dart 在单线程中是以消息循环机制来运行的,其中包含两个任务队列,一个是“微任务队列” microtask queue,另一个“事件队列” event queue。
  • Dart线程运行
    • Dart线程运行过程,入口函数 main() 执行完后,消息循环机制便启动了。
    • 首先会按照先进先出的顺序逐个执行微任务队列中的任务,当所有微任务队列执行完后便开始执行事件队列中的任务,事件任务执行完毕后再去执行微任务,如此循环往复。

Dart中支持异步编程的方式

  • 异步函数:Future和Stream
  • 关键字 asyncawait也支持异步编程

使用 async 和 await 进行异步处理

  • 先看一个案例:
  /*返回值为Future<String>类型,即其返回值未来是一个String类型的值*/
  /*async关键字声明该函数内部有代码需要延迟执行*/
  getData() async {    
    /*await关键字声明运算为延迟执行,然后return运算结果*/
    return await "This is a doubi"; 
  }
  • 调用这个方法,并获取返回值。控制台居然报错
String data = getData();
  • 报错原因
    • data是String类型,而函数getData()是一个异步操作函数,其返回值是一个await延迟执行的结果。在Dart中,有await标记的运算,其结果值都是一个Future对象,Future不是String类型,所以报错。
  • 总结一下:
    • 获取异步方法中直接 return await .. .时,实际上返回的是一个延迟计算的Future对象。
  • 两点需要注意:
    • await关键字必须在async函数内部使用
    • 调用async函数必须使用await关键字

Future是什么

  • 与JavaScript中的Promise非常相似,表示一个异步操作的最终完成(或失败)及其结果值的表示。

  • 就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。

    • Future表示一件“将来”会发生的事情,将来可以从Future中取到一个值。当一个方法返回一个Future时,发生两件事情:
      • 将某件事情排队,返回一个未完成的Future
      • 事情完毕之后,Future的状态会变成已完成,此时就可以取到这件事情的返回值。
  • 获取Future返回值,两种方式:

    • 使用async配合await
    • 使用Future提供的api,其实就是用Future的then方法获取返回值

Future示例

  void doAsyncs() async{
    //then catchError whenComplete
    new Future(() => futureTask()) //  异步任务的函数
        .then((m) => "1-:$m") //   任务执行完后的子任务
        .then((m) => print('2-$m')) //  其中m为上个任务执行完后的返回的结果
        .then((_) => new Future.error('3-:error'))
        .then((m) => print('4-'))
        .whenComplete(() => print('5-')) //不是最后执行whenComplete,通常放到最后回调
        .catchError((e) => print('6-catchError:' + e), test: (Object o) {
      print('7-:' + o);
      return true; //返回true,会被catchError捕获
    })
        .then((_) => new Future.error('11-:error'))
        .then((m) => print('10-'))
        .catchError((e) => print('8-:' + e))
    ;
  }
  futureTask() {
    return Future.delayed(Duration(seconds: 5),()  => "9-走去跑步");
  }
  • 执行结果

I/flutter: 2-1-:9-走去跑步
I/flutter: 5-
I/flutter: 7-:3-:error
I/flutter: 6-catchError:3-:error
I/flutter: 8-:11-:error

介绍一下Async/await

  • Dart中的async/await
    • 和JavaScript中的async/await功能和用法是一样的。

async/await消除callback hell

  • 代码如下:
task() async {
   try{
    String id = await login("alice","******");
    String userInfo = await getUserInfo(id);
    await saveUserInfo(userInfo);
    //执行接下来的操作   
   } catch(e){
    //错误处理   
    print(e);   
   }  
}
  • async用来表示函数是异步的
    • 定义的函数会返回一个Future对象,可以使用then方法添加回调函数。
  • await 后面是一个Future
    • 表示等待该异步任务完成,异步完成后才会往下走;await必须出现在 async 函数内部。

Stream是什么

  • Stream 同样是用于接收异步事件数据,和Future 的区别是,它可以接收多个异步操作的结果(成功或失败)。
  • 在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。

Stream应用示例

  • Stream常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等:
Stream.fromFutures([
  // 1秒后返回结果
  Future.delayed(new Duration(seconds: 1), () {
    return "hello 1";
  }),
  // 抛出一个异常
  Future.delayed(new Duration(seconds: 2),(){
    throw AssertionError("Error");
  }),
  // 3秒后返回结果
  Future.delayed(new Duration(seconds: 3), () {
    return "hello 3";
  })
]).listen((data){
   print(data);
}, onError: (e){
   print(e.message);
},onDone: (){
   print("完成");
});
  • 依次会输出:

I/flutter (17666): hello 1
I/flutter (17666): Error
I/flutter (17666): hello 3

到此这篇关于浅析Dart语言的异步处理的文章就介绍到这了,更多相关Dart 异步处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Dart多个future队列完成加入顺序关系及原子性论证

    Dart多个future队列完成加入顺序关系及原子性论证

    这篇文章主要介绍了Dart多个future队列完成加入顺序关系及原子性论证,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 浅析Dart语言的异步处理

    浅析Dart语言的异步处理

    Dart是一个单线程语言,我们在处理耗时操作的时候使用stream或者future来实现,在这篇文章中我们将简单的给大家聊一聊Dart语言的异步处理
    2023-06-06
  • 关于Dart中的异步编程

    关于Dart中的异步编程

    这篇文章主要介绍了关于Dart中的异步编程,dart 是强类型语言,但由于具备类型推导功能所以类型声明是可选的,需要的朋友可以参考下
    2023-04-04
  • Flutter 图片开发核心技能快速掌握教程

    Flutter 图片开发核心技能快速掌握教程

    这篇文章主要为大家介绍了Flutter 图片开发核心技能快速掌握教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Flutter学习笔记(二)创建一个flutter项目

    Flutter学习笔记(二)创建一个flutter项目

    这篇文章主要介绍了Flutter学习笔记(二)创建一个flutter项目,其中运行的过程,可能涉及到网络环境配置的问题,需要的朋友可以参考下
    2023-04-04
  • Dart语法之变量声明与数据类型实例详解

    Dart语法之变量声明与数据类型实例详解

    这篇文章主要为大家介绍了Dart语法之变量声明与数据类型实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Dart 异步编程生成器及自定义类型用法详解

    Dart 异步编程生成器及自定义类型用法详解

    这篇文章主要为大家介绍了Dart 异步编程生成器及自定义类型用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Flutter Dart快速排序算法示例详解

    Flutter Dart快速排序算法示例详解

    这篇文章主要为大家介绍了Flutter Dart快速排序算法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Flutter SizedBox布局组件Widget使用示例详解

    Flutter SizedBox布局组件Widget使用示例详解

    这篇文章主要为大家介绍了Flutter SizedBox布局组件Widget使用示例详解
    2023-02-02
  • Dart String字符串的常用方法总结概述

    Dart String字符串的常用方法总结概述

    这篇文章主要为大家介绍了Dart String字符串的常用方法概述,总结整理了大概4000多字,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论