Dart基础7-异步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart基础7-异步相关的知识,希望对你有一定的参考价值。
参考技术Ajava中用thread来支持异步操作,而dart中用的是Future
基础使用
我们在Future中使用延迟操作并不影响main线程的其他方法执行,并不会阻塞线程
打印结果为:
await关键字,会先执行函数,然后返回一个Future对象
await必须在async修饰的函数中才能使用
如果函数没有返回一个有用的值,那么将其返回Future<void>类型
打印结果
whenComplete和then区别
这里会建立2个队列,Microtask队列和event队列,Microtask优先于event队列,当Microtask全部执行完后才会执行event
打印顺序是:
在s1之后的then又创建了一个Future,Future需要当前Zone的Future全部执行完,才会执行下一个。而s3需要在s2执行完毕后才执行,因为需要等待s2那步返回的参数
如果将第一个改为:
打印结果
内部其实使用的是一个定时任务
我们做一个测试:
接着分析一下then:
并未做什么处理,直接追踪 _thenNoZoneRegistration
找到了一个增加监听器的方法,进入查看
一大段处理后,最终来到scheduleMicrotask方法
内部其实还是使用的scheduleMicrotask,创建一个Microtask队列
到此,我们来模拟一下:
也简单的实现了then的效果
为了保持你app的可响应性,大计算量的任务放入额外的isolate中
官方使用例子:
当需要延迟地生成一个值序列时,请考虑使用生成器函数
递归生成器使用方法是一样的
详细可参见: https://webdev.dartlang.org/articles/performance/event-loop
以上是关于Dart基础7-异步的主要内容,如果未能解决你的问题,请参考以下文章