dart系列之:dart中的异步编程
文章目录
- 简介
- 为什么要用异步编程
- 怎么使用
- Future
- 异步异常处理
- 在同步函数中调用异步函数
- 总结
简介
熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方便的进行异步编程,从而摆脱了回调地狱。dart作为一种新生的语言,没有理由不继承这种优秀的品质。很自然的,dart中也有await和async语言,一起来看看吧。
为什么要用异步编程
那么为什么要用异步编程呢? 只用同步不能够解决吗?
其实大多情况下同步已经够用了,但是在下面的几种情况下,同步的场景还是有缺陷的。
- 需要花很长时间从网络上下载数据的情况。
- 读取数据库的耗时情况。
- 从文件读取数据的情况。
总结而言,如果某些操作需要花费大量的时间,那么就可以用到异步编程了。
怎么使用
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中的异步编程相关推荐
- dart系列之:dart语言中的特殊操作符
dart系列之:dart语言中的特殊操作符 文章目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外 ...
- dart系列之:dart优秀的秘诀-隔离机制
文章目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异 ...
- 一文说通C#中的异步编程补遗
前文写了关于C#中的异步编程.后台有无数人在讨论,很多人把异步和多线程混了. 文章在这儿:一文说通C#中的异步编程 所以,本文从体系的角度,再写一下这个异步编程. 一.C#中的异步编程演变 1. ...
- 一文说通C#中的异步编程
天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章. 一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...
- 【转】.Net中的异步编程总结
一直以来很想梳理下我在开发过程中使用异步编程的心得和体会,但是由于我是APM异步编程模式的死忠,当TAP模式和TPL模式出现的时候我并未真正的去接纳这两种模式,所以导致我一直没有花太多心思去整理这两部 ...
- 了解和使用DotNetCore和Blazor中的异步编程
目录 介绍 您对异步编程了解什么? 那么,什么是异步编程? 我们什么时候应该使用它? 任务.线程.计划.上下文 到底是怎么回事? Asnyc编码模式 命名约定 异步任务模式 任务模式 事件模式 阻塞与 ...
- .NET中的异步编程——常见的错误和最佳实践
目录 背景 async void 没有线程 Foreach和属性 始终异步 在这篇文章中,我们将通过使用异步编程的一些最常见的错误来给你们一些参考. 背景 在之前的文章中,我们开始分析.NET世界中的 ...
- C#中的异步编程(Async)
文章目录 C#中的异步编程(Async) 前言 示例代码 C#中的异步编程(Async) 前言 所谓的异步,就是指代码在运行的过程中,不会发生阻塞,例如我们玩游戏的时候,游戏在下载资源或者在加载本地资 ...
- .NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead
本文首发在IT168 写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过三篇文章后很多人对IO异步背后实现 ...
最新文章
- linux 将文件分成两部分,linux 将大文件分成小文件
- java防止用户越权访问文件_针对功能权限(url访问)如何避免越权访问
- C#内存泄露与资源释放 经验总结
- 实现自己的轻量级http调用工具
- 将SQL-SERVER逆向工程导入Power-Design中并给表的字段添加注释
- 汇编语言:实验10 根据材料编程—2.解决除法溢出的问题
- 华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓
- mysql自增 java_如何在java中自动增加mysql中的用户id
- 双指针 -- 验证回文串
- mybatis plus+spring boot 多租户动态数据源实现方案
- 根据卡号识别银行卡类型
- CorelDRAW X8 /CDR2020官方序列号密钥下载矢量绘图软件
- Mac下导入virtualenv报错:its parent directory is not owned by the current user
- JavaScript高级程序设计读书笔记(第6章面向对象的程序设计之创建对象)
- 监控系统存储服务器和磁盘阵列,浅谈磁盘阵列如何应用于监控储存领域
- TinkerBoard-S 上手体验
- total commander 自定义快捷键
- 如何用java制作动画_如何制作动画(java实现动画的代码)
- 企业邮箱托管选哪家好,163企业邮箱如何购买?
- 有导师学习神经网络的回归拟合——基于近红外光谱的汽油辛烷值预测