Dart语言的异步编程之Future和async-await是杀
2019-02-08 本文已影响53人
iCloudEnd
Dart语言的异步编程之Future和async-await是杀手级功能
什么async和await
还记得《Dart语言的运算符重载》中讲到的语法糖么?async和await又是一块比较好吃的语法糖。Dart语言在2014年就已经开始支持async-await语法了。
其它语言对持async-await语法支持
await是发现于C#5.0、Python3.5中、Hack以及Kotlin 1.1的一个特性。
什么future
Dart语言中的Future表示在将来某时获取一个值的方式。当一个返回Future的函数被调用的时候,做了两件事情:
(1)函数把自己放入队列和返回一个未完成的Future对象
(2)之后当值可用时,Future带着值变成完成状态。
(3)为了获得Future的值,有两种方式:使用async和await和使用Future的接口
上面描述可能比较抽象,我还是从future这个来源讲起了吧。
在编程领域,为了更好更方便的开发并发程序,计算机理论界的大牛(Henry Baker和Carl Hewitt)发明了future概念。future描述了一个对象, 该对象充当最未知结果的代理。例如我们刷了一下微信朋友圈,future就代表腾讯服务返回给我的好友朋友圈动态。
future概念在分布式计算中得到了应用 。在性能方面减少了,通信往返的延迟。在语义方面,future提高并行程序的鲁棒性和可读性。
Future async await demo
异步获取服务器文件
import 'dart:async';
import 'dart:html';
Future<void> printDailyNewsDigest() async {
var newsDigest = await gatherNewsReports();
print(newsDigest);
}
main() {
printDailyNewsDigest();
printWinningLotteryNumbers();
printWeatherForecast();
printBaseballScore();
}
printWinningLotteryNumbers() {
print('Winning lotto numbers: [23, 63, 87, 26, 2]');
}
printWeatherForecast() {
print("Tomorrow's forecast: 70F, sunny.");
}
printBaseballScore() {
print('Baseball score: Red Sox 10, Yankees 0');
}
const news = '<gathered news goes here>';
const oneSecond = Duration(seconds: 1);
// 模拟服务器demo
//Future<String> gatherNewsReports() =>
// Future.delayed(oneSecond, () => news);
Future<String> gatherNewsReports() => HttpRequest.getString(
'https://www.dartlang.org/f/dailyNewsDigest.txt',
);
输出结果:
Winning lotto numbers: [23, 63, 87, 26, 2]
Tomorrow's forecast: 70F, sunny.
Baseball score: Red Sox 10, Yankees 0
<gathered news goes here>