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

Dart中的异步操作

作者头像
flyou
发布于 2019-08-06 09:08:38
发布于 2019-08-06 09:08:38
1.7K00
代码可运行
举报
文章被收录于专栏:flutter开发者flutter开发者
运行总次数:0
代码可运行

上期回顾


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

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

为什么要用异步


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

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

从逻辑来看我们确实是先进入了餐馆,然后等待菜来,等的期间开始了聊天和玩手机。但是因为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
代码运行次数:0
运行
复制

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

在Future Api中我们可以使用

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

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

试一下 async


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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

Future的其他用法

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

小结


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

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

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Dart中的异步编程——Future、async和await
首先Dart是一门单线程的语言,那么Dart对异步操作对支持,可以使我们在编写Dart程序时可以异步的来执行耗时操作。从而可以在等待一个操作完成的同时进行别的操作以下是一些常见的异步操作:
CC老师
2020/05/26
2.5K0
Dart中的异步编程——Future、async和await
Dart 异步
一条执行线上,同时且只能执行一个任务(事件),其他任务都必须在后面排队等待被执行。也就是说,在一条执行线上,为了不阻碍代码的执行,每遇到的耗时任务都会被挂起放入任务队列,待执行结束后再按放入顺序依次执行队列上的任务,从而达到异步效果。
Hankkin
2020/01/13
1.7K0
Dart 异步
Flutter--Dart基础语法(四)异步
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,Flutter 开源、免费,拥有宽松的开源协议,支持移动、Web、桌面和嵌入式平台。
mukekeheart
2021/02/05
1.5K0
Dart语法详解(三)——进阶篇
在上一篇文章,我们详细的介绍了Dart语法的一些基本语法,这一这篇文章,我们继续介绍Dart的语法的相关知识。
Demo_Yang
2020/03/24
1K0
持续发烧,试试Dart语言的异步操作,效率提升500%
昨天发了篇文章《Dart开发服务端,我是不是发烧(骚)了》,承蒙小编看得起上了首页。
程序员汤汤
2021/06/29
8520
持续发烧,试试Dart语言的异步操作,效率提升500%
Dart学习 Future 异步/ Isolate 隔离
也可以使用async 和 await,将异步代码同步的写出,去掉了.then的链式调用
KID.
2024/01/31
1950
Flutter中async与await异步编程原理分析
先谈谈任务调度 ,大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,对于单核CPU来讲,并行执行两个任务,实际上是CPU在进行着快速的切换,对用户来讲感觉不到有切换停顿,就好比220V交流电灯光显示原理一样,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。
早起的年轻人
2020/08/11
2.2K0
Flutter中async与await异步编程原理分析
《深入浅出Dart》Dart的异步编程
在 Dart 中,我们使用 Future 和 async/await 来进行异步编程。当你调用一个异步函数时,它将立即返回一个 Future 对象。当异步操作完成时,Future 将被“完成”或“解析”。
linwu
2023/07/27
2340
Dart异步与并发
Dart是单线程执行,也就是说一旦Dart函数开始执行,就会一直持续直到结束,Dart函数不能被其他Dart代码中断。
Helloted
2022/06/08
1.2K0
Dart异步与并发
Dart中的异步和多线程
首先,我们要明确,异步和多线程是两个概念,异步指的是不需要等待任务执行完毕就会接着执行接下来的任务,而多线程指的是多条线程一起执行任务。异步任务可以在单线程中执行,也可以在多线程中执行。
拉维
2021/12/01
2.7K0
Dart中的异步和多线程
Flutter异步与线程详解
      关于 Dart,我相信大家都知道Dart是一门单线程语言,这里说的单线程并不是说Dart没有或着不能使用多线程,而是Dart的所有API默认情况下都是单线程的。但大家也都知道Dart是有办法支持多线程和异步操作的,关于多线程和异步这两个概念是需要我们理清楚的,不能混淆它们的概念,给我们的理解造成困扰。
Mr.RisingSun
2022/05/11
2K0
Flutter异步与线程详解
js有哪些异步操作_js单线程怎么实现异步
JavaScript引擎是基于单线程 (Single-threaded) 事件循环的概念构建的,同一时刻只允许一个代码块在执行,所以需要跟踪即将运行的代码,那些代码被放在一个任务队列 (job queue) 中,每当一段代码准备执行时,都会被添加到任务队列中。每当JavaScript引擎中的一段代码结束执行,时间循环 (event loop) 会执行队列中的下一个任务,它是 JavaScript 引擎中的一段程序,负责监控代码执行并管理任务队列。
全栈程序员站长
2022/08/04
3.3K0
「 Dart Js Ts 」给前端工程师的一张Dart语言入场券
Flutter 使用 Dart 语言进行开发,小 null 在写 Flutter 的过程中发现 Dart 和 Javascript/Typescript 有些相似之处~
null仔
2020/05/22
1.6K0
Dart 相关语法笔记
dart中没有private、protect、public等修饰符。默认的都是可以被访问的。那么是怎样控制权限访问的呢?
Hankkin
2020/01/13
5130
dart系列之:dart中的异步编程
熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方便的进行异步编程,从而摆脱了回调地狱。dart作为一种新生的语言,没有理由不继承这种优秀的品质。很自然的,dart中也有await和async语言,一起来看看吧。
程序那些事
2021/11/21
1.4K0
Dart 异步编程之 Isolate 和事件循环。
尽管 Dart 是个单线程任务,但它提供 Future、Stream、后台任务以及其他特性用于编写现代异步程序以及响应式程序(Flutter)。本文讲的是 Dart 后台任务的基础:Isolate 和事件循环。
徐建国
2021/08/12
1.5K0
Flutter之旅:Dart语法扫尾-包访问-泛型--异常-异步-mixin
1、其他常用符号与关键字 1.1:级联操作符:.. 那Paint对象的设置来看: ---->[情景1:曾经的写法]---- var paint = Paint(); paint.strokeCap = StrokeCap.round; paint.style = PaintingStyle.stroke; //画线条 paint.color = Color(0xffBBC3C5); //画笔颜色 paint.isAntiAlias = true; //抗锯齿 paint.filterQuality =
张风捷特烈
2020/04/30
1K0
Flutter之旅:Dart语法扫尾-包访问-泛型--异常-异步-mixin
【Flutter 专题】90 图解 Dart 单线程实现异步处理之 Future (一)
和尚尝试过 Future 和 Stream 实现 Dart 异步处理,但仅限于基本的使用,网上有很多相关的资料,和尚仅从初识者的角度学习了解 Dart 的实现的异步处理;
阿策小和尚
2020/06/09
8600
flutter 队列
总结:dart 是一门单线程语言,但是可通过async await 将任务添加到异步队列来管理,来达到任务异步去执行 await 所在的函数必须是异步函数,async修饰的函数
黑兔
2022/12/17
6170
Dart 语言异步编程之Future
编程中的代码执行,通常分为同步与异步两种。简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式。但是同步代码的缺点也显而易见,如果其中某一行或几行代码非常耗时,那么就会阻塞,使得后面的代码不能被立刻执行。
arcticfox
2019/09/17
1.7K0
Dart 语言异步编程之Future
相关推荐
Dart中的异步编程——Future、async和await
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验