Dart語(yǔ)言的異步編程之Future和async-await是殺手級(jí)功能
什么async和await
還記得《Dart語(yǔ)言的運(yùn)算符重載》中講到的語(yǔ)法糖么?async和await又是一塊比較好吃的語(yǔ)法糖。Dart語(yǔ)言在2014年就已經(jīng)開(kāi)始支持async-await語(yǔ)法了竟终。
其它語(yǔ)言對(duì)持async-await語(yǔ)法支持
await是發(fā)現(xiàn)于C#5.0僵井、Python3.5中扼仲、Hack以及Kotlin 1.1的一個(gè)特性虎锚。
什么future
Dart語(yǔ)言中的Future表示在將來(lái)某時(shí)獲取一個(gè)值的方式壁查。當(dāng)一個(gè)返回Future的函數(shù)被調(diào)用的時(shí)候,做了兩件事情:
(1)函數(shù)把自己放入隊(duì)列和返回一個(gè)未完成的Future對(duì)象
(2)之后當(dāng)值可用時(shí)璧尸,F(xiàn)uture帶著值變成完成狀態(tài)咒林。
(3)為了獲得Future的值,有兩種方式:使用async和await和使用Future的接口
上面描述可能比較抽象逗宁,我還是從future這個(gè)來(lái)源講起了吧映九。
在編程領(lǐng)域,為了更好更方便的開(kāi)發(fā)并發(fā)程序瞎颗,計(jì)算機(jī)理論界的大牛(Henry Baker和Carl Hewitt)發(fā)明了future概念。future描述了一個(gè)對(duì)象, 該對(duì)象充當(dāng)最未知結(jié)果的代理捌议。例如我們刷了一下微信朋友圈哼拔,future就代表騰訊服務(wù)返回給我的好友朋友圈動(dòng)態(tài)。
future概念在分布式計(jì)算中得到了應(yīng)用 瓣颅。在性能方面減少了倦逐,通信往返的延遲。在語(yǔ)義方面宫补,future提高并行程序的魯棒性和可讀性檬姥。
Future async await demo
異步獲取服務(wù)器文件
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);
// 模擬服務(wù)器demo
//Future<String> gatherNewsReports() =>
// Future.delayed(oneSecond, () => news);
Future<String> gatherNewsReports() => HttpRequest.getString(
'https://www.dartlang.org/f/dailyNewsDigest.txt',
);
輸出結(jié)果:
Winning lotto numbers: [23, 63, 87, 26, 2]
Tomorrow's forecast: 70F, sunny.
Baseball score: Red Sox 10, Yankees 0
<gathered news goes here>