dart系列之:dart中的异步编程

简介: dart系列之:dart中的异步编程

目录



简介


熟悉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的用法。

相关文章
|
5月前
|
Dart 前端开发 JavaScript
Dart之异步编程(一):Dart 语言异步编程基础
Dart之异步编程(一):Dart 语言异步编程基础
92 0
|
3月前
|
Dart
flutter 之 Dart 异步编程【详解】
flutter 之 Dart 异步编程【详解】
37 0
|
Dart 前端开发 JavaScript
《深入浅出Dart》Dart的异步编程
Dart的异步编程 在 Dart 中,我们使用 Future 和 async/await 来进行异步编程。当你调用一个异步函数时,它将立即返回一个 Future 对象。当异步操作完成时,Future 将被“完成”或“解析”。 使用 Future Future 是 Dart 中用于表示异步操作的对象。当你调用一个异步函数时,它会立即返回一个 Future 对象,表示这个异步操作的结果。
155 0
|
XML JSON Dart
《深入浅出Dart》Dart的Isolate
Dart的Isolate Isolate 是 Dart 中进行并发编程的一种方式。由于 Dart 是单线程模型,因此在需要处理 CPU 密集型任务或需要执行长时间运行的操作时,可以使用 Isolate。以下列出了一些常见的 Isolate 应用场景: 创建 Isolate 在 Dart 中,所有的代码都运行在一个单线程中,这个线程被称为主 Isolate。如果你需要执行耗时的计算,你可以创建一个新的 Isolate,然后在这个新的 Isolate 中执行你的计算。
145 0
|
JSON Dart 编译器
Dart简单介绍
Dart是一种面向对象、用于构建高性能应用程序的编程语言,它具有快速开发、易于维护和可移植性等特点,因此在 Flutter 应用程序开发方面越来越受欢迎。在这篇文章中,我们将深入探讨 Dart 语言的一些技术思考。 类型系统
Dart简单介绍
|
存储 Dart JavaScript
Flutter(三)——一篇文章掌握Dart语言的用法(一)
Flutter(三)——一篇文章掌握Dart语言的用法(一)
373 0
Flutter(三)——一篇文章掌握Dart语言的用法(一)
|
存储 Dart 前端开发
Flutter(三)——一篇文章掌握Dart语言的用法(三)
Flutter(三)——一篇文章掌握Dart语言的用法(三)
261 0
Flutter(三)——一篇文章掌握Dart语言的用法(三)
Runes——Dart
Dart中,Runes是指UTF-32定义的Unicode字符串。 Unicode使用数字表示世界上所有的字母、数字和符号。因为Dart中的String是一系列UTF-16字节单元,而在String中想要表示32位的Unicode值,则需要特殊的语法。 一般我们使用 `\uXXXX` 这种形式表示一个Unicode码,`XXXX`表示4个十六进制值。例如,字符(♥)的Unicode字符是`\u2665`。 当十六进制数据多余或者少于4位时,将十六进制数放入到花括号中,例如,微笑表情(😆)是`\u{1f600}`。 String类中有几个属性你可以用来获取`rune`信息。
|
Dart JavaScript 前端开发
Numbers——Dart
Dart中的数字类型有两种,int和double。
|
Dart 开发工具
使用 dart tear-off
使用 dart tear-off
124 0