文章目录

  • 简介
  • 为什么要用异步编程
  • 怎么使用
  • Future
  • 异步异常处理
  • 在同步函数中调用异步函数
  • 总结

简介

熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方便的进行异步编程,从而摆脱了回调地狱。dart作为一种新生的语言,没有理由不继承这种优秀的品质。很自然的,dart中也有await和async语言,一起来看看吧。

为什么要用异步编程

那么为什么要用异步编程呢? 只用同步不能够解决吗?

其实大多情况下同步已经够用了,但是在下面的几种情况下,同步的场景还是有缺陷的。

  1. 需要花很长时间从网络上下载数据的情况。
  2. 读取数据库的耗时情况。
  3. 从文件读取数据的情况。

总结而言,如果某些操作需要花费大量的时间,那么就可以用到异步编程了。

怎么使用

async是方法的描述符,如果要使用await,则必须配合async一起使用:

Future<void> checkVersion() async {var version = await lookUpVersion();// Do something with version
}

注意,await后面一般接着的是Future对象。

先看一个错误使用异步编程的例子:


String createOrderMessage() {var order = fetchUserOrder();return 'Your order is: $order';
}Future<String> fetchUserOrder() =>Future.delayed(const Duration(seconds: 2),() => 'Order one!',);void main() {print(createOrderMessage());
}

上面的代码本意是打印出从数据库耗时取出的数据,但是结果并不是想象的那样,其原因就是fetchUserOrder方法是一个异步方法,所以不会立即返回,从而导致结果打印失败。

将上面的代码用async改写:

Future<String> createOrderMessage() async {var order = await fetchUserOrder();return 'Your order is: $order';
}Future<String> fetchUserOrder() =>Future.delayed(const Duration(seconds: 2),() => 'Large Latte',);Future<void> main() async {print('Fetching user order...');print(await createOrderMessage());
}

Future

上面我们在使用async和await的过程中使用到了Future。在java中Future表示的是线程的执行结果。在dart中Future表示的是一个异步执行的结果。

Future有两种状态:uncompleted 或者 completed。

当最开始执行一个异步函数的时候,会返回一个未完成的Future。这个未完成的Future会等等异步执行的完成或者失败。

不管异步程序是成功还是失败,最终都会返回一个完成状态。

async返回的Future可以接泛型,表示的时候返回的具体类型,比如Future 表示的是返回一个字符串,而 Future表示不返回任何值。

下面是两个不同返回的例子:

Future<String> fetchUserOrder() {return Future.delayed(const Duration(seconds: 2), () => 'Large Latte');
}Future<void> fetchUserOrder() {return Future.delayed(const Duration(seconds: 2), () => print('Large Latte'));
}

下面是一个异常的例子:

Future<void> fetchUserOrder() {return Future.delayed(const Duration(seconds: 2),() => throw Exception('Logout failed: user ID is invalid'));
}

异步异常处理

在async的函数中,对await的异步方法中抛出的异常,可以直接是用try catch来进行异常的捕获:

try {print('Awaiting user order...');var order = await fetchUserOrder();
} catch (err) {print('Caught error: $err');
}

在同步函数中调用异步函数

上面介绍的fetchUserOrder()返回的是一个Future,表示的是一个异步执行的过程。

那么如果是一个同步的方法,比如main()函数中,如何去调用异步方法,并且得到返回值呢?

await肯定是不行的,因为await只能在async的方法中调用。这个时候就可以用到then语句:

fetchUserOrder().then(order=>'do something');

then语句会等待异步执行返回结果,然后对结果进行处理,实际上就等同于javascript中的回调。

总结

以上就是dart中async和await的用法。

本文已收录于 http://www.flydean.com/12-dart-async/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

dart系列之:dart中的异步编程相关推荐

  1. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 文章目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外 ...

  2. dart系列之:dart优秀的秘诀-隔离机制

    文章目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异 ...

  3. 一文说通C#中的异步编程补遗

    前文写了关于C#中的异步编程.后台有无数人在讨论,很多人把异步和多线程混了. 文章在这儿:一文说通C#中的异步编程 所以,本文从体系的角度,再写一下这个异步编程.   一.C#中的异步编程演变 1. ...

  4. 一文说通C#中的异步编程

    天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章.   一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...

  5. 【转】.Net中的异步编程总结

    一直以来很想梳理下我在开发过程中使用异步编程的心得和体会,但是由于我是APM异步编程模式的死忠,当TAP模式和TPL模式出现的时候我并未真正的去接纳这两种模式,所以导致我一直没有花太多心思去整理这两部 ...

  6. 了解和使用DotNetCore和Blazor中的异步编程

    目录 介绍 您对异步编程了解什么? 那么,什么是异步编程? 我们什么时候应该使用它? 任务.线程.计划.上下文 到底是怎么回事? Asnyc编码模式 命名约定 异步任务模式 任务模式 事件模式 阻塞与 ...

  7. .NET中的异步编程——常见的错误和最佳实践

    目录 背景 async void 没有线程 Foreach和属性 始终异步 在这篇文章中,我们将通过使用异步编程的一些最常见的错误来给你们一些参考. 背景 在之前的文章中,我们开始分析.NET世界中的 ...

  8. C#中的异步编程(Async)

    文章目录 C#中的异步编程(Async) 前言 示例代码 C#中的异步编程(Async) 前言 所谓的异步,就是指代码在运行的过程中,不会发生阻塞,例如我们玩游戏的时候,游戏在下载资源或者在加载本地资 ...

  9. .NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead

    本文首发在IT168 写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过三篇文章后很多人对IO异步背后实现 ...

最新文章

  1. linux 将文件分成两部分,linux 将大文件分成小文件
  2. java防止用户越权访问文件_针对功能权限(url访问)如何避免越权访问
  3. C#内存泄露与资源释放 经验总结
  4. 实现自己的轻量级http调用工具
  5. 将SQL-SERVER逆向工程导入Power-Design中并给表的字段添加注释
  6. 汇编语言:实验10 根据材料编程—2.解决除法溢出的问题
  7. 华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓
  8. mysql自增 java_如何在java中自动增加mysql中的用户id
  9. 双指针 -- 验证回文串
  10. mybatis plus+spring boot 多租户动态数据源实现方案
  11. 根据卡号识别银行卡类型
  12. CorelDRAW X8 /CDR2020官方序列号密钥下载矢量绘图软件
  13. Mac下导入virtualenv报错:its parent directory is not owned by the current user
  14. JavaScript高级程序设计读书笔记(第6章面向对象的程序设计之创建对象)
  15. 监控系统存储服务器和磁盘阵列,浅谈磁盘阵列如何应用于监控储存领域
  16. TinkerBoard-S 上手体验
  17. total commander 自定义快捷键
  18. 如何用java制作动画_如何制作动画(java实现动画的代码)
  19. 企业邮箱托管选哪家好,163企业邮箱如何购买?
  20. 有导师学习神经网络的回归拟合——基于近红外光谱的汽油辛烷值预测

热门文章

  1. NEFU704(AC自动机+状态压缩)
  2. 视音频数据处理入门:UDP-RTP协议解析
  3. 关于寻路算法的一些思考(2):Heuristics 函数
  4. 手把手教你玩转网络编程模型之完成例程(Completion Routine)
  5. SQL Server date、datetime、smalldate区别
  6. #pragma预处理命令
  7. 读《Android 安全架构深究》
  8. 最容易被盗的密码,你中了么?
  9. 深入了解什么是Docker
  10. C++ STL : 模拟实现STL中的容器适配器stack和queue