前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart中的异步操作

Dart中的异步操作

作者头像
flyou
发布2019-08-06 17:08:38
1.5K0
发布2019-08-06 17:08:38
举报
文章被收录于专栏:flutter开发者flutter开发者

上期回顾


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

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

为什么要用异步


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

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

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

代码语言:javascript
复制

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

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

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

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

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

什么是Future


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

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

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

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

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

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

代码语言:javascript
复制

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

在Future Api中我们可以使用

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

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

代码语言:javascript
复制

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

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

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

试一下 async


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

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

代码语言:javascript
复制

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

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

Future的其他用法

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

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

代码语言:javascript
复制

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

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

代码语言:javascript
复制

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

小结


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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 flutter开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上期回顾
  • 为什么要用异步
  • 什么是Future
  • 试一下 async
    • Future的其他用法
    • 小结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档