专栏首页flutter开发者Dart中的异步操作

Dart中的异步操作

上期回顾


在前面的文章中我们很多次提到了Future这个东西,这个单词翻译过来的意思是‘未来’的意思。在flutter中它表示一个未来某些时候返回数据的一个对象。

借助Future我们可以在Flutter实现异步操作,今天我们就来正式了解下Future。

为什么要用异步


首先我们知道Dart这门语言是单线程的。同步代码的执行会让我们的程序处于过长时间的等待状态终止ANR。

对于耗时的操作(I/O、网络操作等)我们必须要使用异步来处理它们,只有这样,才不会因为这些耗时的操作来影响程序的正常运行。

比如说我们去餐馆吃饭,在等餐的过程中我们一边和朋友聊天,一边玩手机。这个场景用代码表示如下:

运行下,看下控制台输出:

和朋友进入了一家餐馆 我们的菜来了,我要开始吃饭了 我们朋友聊起家常 等了好好久了,我还是玩会手机吧

从逻辑来看我们确实是先进入了餐馆,然后等待菜来,等的期间开始了聊天和玩手机。但是因为Dart是单线程的所以无论你等待饭来的时间多长,在这个操作没有完成之前他都不会去执行下面的操作,这样就不美好了啊,我在等吃饭的时间内什么也做不了了啊。

上面的例子就是非异步操作引起的问题。在Flutter要想解决上面的问题可以借助于Future来解决这个问题

下面我们就来看看什么是Future

什么是Future


Future是在未来某个时间获得想要对象的一种手段。

当调用Future后系统会将使用Future的操作放入一个队列中去排队执行,并返回一个未完成的Future对象,当事件完成后或者有一个可用的值时Future就会调用自己的then回调让调用者去处理这个对象。

在Flutter中我们可以使用如下两种方式来获取Future。

  1. 使用Future APi
  2. 使用async和await (Dart1.9后支持)

还是以上面的场景为例,我们先借助于Future APi来实现异步效果。

首先我们需要自己声明一个属于我们的Future对象。

我们个Future传入了我们需要的返回值类型String并且将我们需要耗时操作的函数传递给了Future,这样我们就可以获得一个Future对象。

在Future Api中我们可以使用

waitDinnerFuture.then((str){});接收上层返回可用的值 waitDinnerFuture.whenComplete((){});事件完成回调 waitDinnerFuture.catchError((error){});事件错误的捕获 waitDinnerFuture.timeout(new Duration(microseconds: 30));超时时间

好吧,也非常的简单,那么我就试下效果哈。

可以看到,在调用的地方吧我们只是处理了下调用等待吃饭的过程,其他的操作还是按照原来的去执行,在这里我们仅仅调用了then方法。来看下控制台输出。

和朋友进入了一家餐馆 我们朋友聊起家常 等了好好久了,我还是玩会手机吧 我们的菜来了,我要开始吃饭了

这样的话我们就可以在等餐的同时愉快的玩耍了。

试一下 async


同样的我们也可以借助于async和await来获取一个Future对象。

首先我们需要使用async来修饰需要异步处理的方法上,然后使用await来修饰需要异步操作的地方,然后 这个函数就可以返回一个Future对象了。

同样的我们来看下控制台的输出

和朋友进入了一家餐馆 我们朋友聊起家常 等了好好久了,我还是玩会手机吧 我们的菜来了,我要开始吃饭了

Future的其他用法

考虑三个功能expensiveA(),expensiveB()以及expensiveC()都返回Future对象

使用then()链接函数调用 当Future-returning函数需要按顺序运行时,请使用链式then() 调用:

等待多个Future以完成使用Future.wait() 如果功能的执行顺序不重要,可以使用 Future.wait()。

这些功能快速连续触发; 当他们都完成一个价值,Future.wait()返回一个新的未来。这个未来完成了包含每个函数产生的值的列表。

具体怎么使用还需要大家在用到的时候看下就好了。

小结


  • Dart是单线程的变成语言
  • 使用Future可以是同步操作异步化
  • Future可以使用async和await来回去
  • Future可以处理链式调用和多个Future同时返回结果

点击左下角阅读原文,体验更佳阅读效果

我怀疑这个是个坏掉的二维码,分享到朋友圈试试?

本文分享自微信公众号 - flutter开发者(Flutter_Developers),作者:flyou

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​Flutter中异常处理

    Dart是单进程机制,所以在这个进程中出现问题时仅仅会影响当前进程,在事件循环中,当某个任务发生异常并没有被捕获时,程序并不会退出,而直接导致的结果是当前任务的...

    flyou
  • Flutter动画【3】

    在前面的文章中我们看了下Flutter中的补间动画和Flutter Widgets,今天我们来看下页面过渡动画,也可以叫做共享元素动画,页面A的元素过渡到页面B...

    flyou
  • Flutter动画【1】

    在前面的文章中我们花了很多的时间去讲了Flutter中的Widget以及用户操作,但是我们却很少去关注与用户的交互效果,当然这并不会导致我们的程序崩溃或者不能实...

    flyou
  • 零成本异步 I/O (下)

    这个非常出色的基于轮询的新方案——我们编写了这个模型,我归功于 Alex 和 Aaron Turon,是他们提出了这个想法——不是由 Future 来调度回调函...

    MikeLoveRust
  • Flutter必备语言Dart教程04 - 异步,库

    现在我们来看看如何在Dart中处理异步代码。使用Flutter时,会执行各种操作,例如网络调用和数据库访问,这些操作都应该异步执行。

    前端知否
  • # Event loop

    ​ dart是一种单线程语言,异步模型主要是通过事件轮询(event loop)来实现,另外也提供了更高级的Isolate来支持多线程,通常用于计算比较耗时的操...

    用户1175783
  • Java多线程编程-(19)-多线程异步调用之Future模式

    在《Java多线程编程-(8)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier》 这一篇中,我们使用线程计数器的方式实现了...

    Java后端技术
  • netty案例,netty4.1源码分析篇六《Netty异步架构监听类Promise源码分析》

    他们的含义都是对未来即将要发生的事情做相应的处理,这也是在异步编程中非常常见的类名。

    小傅哥
  • Flutter异步编程

    经常听说 future,或者从其他语言见到类似的说法如 javascript 的 Promise。那么究竟什么是 future?

    ChildhoodAndy
  • Flutter/Dart中的异步

    我们所熟悉的前端开发框架大都是事件驱动的。事件驱动意味着你的程序中必然存在事件循环和事件队列。事件循环会不停的从事件队列中获取和处理各种事件。也就是说你的程序必...

    HowHardCanItBe

扫码关注云+社区

领取腾讯云代金券