亚洲一区精品自拍_2021年国内精品久久_男同十八禁gv在线观看_免费观看a级性爱黄片

Article / 文章中心

dart系列之:dart中的異步編程

發(fā)布時(shí)間:2021-11-22 點(diǎn)擊數(shù):683

簡(jiǎn)介

熟悉javascript的朋友應(yīng)該知道,在ES6中引入了await和async的語法,可以方便的進(jìn)行異步編程,從而擺脫了回調(diào)地獄。dart作為一種新生的語言,沒有理由不繼承這種優(yōu)秀的品質(zhì)。很自然的,dart中也有await和async語言,一起來看看吧。

為什么要用異步編程

那么為什么要用異步編程呢? 只用同步不能夠解決嗎?

其實(shí)大多情況下同步已經(jīng)夠用了,但是在下面的幾種情況下,同步的場(chǎng)景還是有缺陷的。

  1. 需要花很長(zhǎng)時(shí)間從網(wǎng)絡(luò)上下載數(shù)據(jù)的情況。
  2. 讀取數(shù)據(jù)庫的耗時(shí)情況。
  3. 從文件讀取數(shù)據(jù)的情況。

總結(jié)而言,如果某些操作需要花費(fèi)大量的時(shí)間,那么就可以用到異步編程了。

怎么使用

async是方法的描述符,如果要使用await,則必須配合async一起使用:

Future<void> checkVersion() async {  var version = await lookUpVersion();  // Do something with version }

注意,await后面一般接著的是Future對(duì)象。

先看一個(gè)錯(cuò)誤使用異步編程的例子:

String createOrderMessage() {  var order = fetchUserOrder();  return 'Your order is: $order'; } Future<String> fetchUserOrder() =>  Future.delayed(  const Duration(seconds: 2),  () => 'Order one!',  ); void main() {  print(createOrderMessage()); }

上面的代碼本意是打印出從數(shù)據(jù)庫耗時(shí)取出的數(shù)據(jù),但是結(jié)果并不是想象的那樣,其原因就是fetchUserOrder方法是一個(gè)異步方法,所以不會(huì)立即返回,從而導(dǎo)致結(jié)果打印失敗。

將上面的代碼用async改寫:

Future<String> createOrderMessage() async {  var order = await fetchUserOrder();  return 'Your order is: $order'; } Future<String> fetchUserOrder() =>  Future.delayed(  const Duration(seconds: 2),  () => 'Large Latte',  ); Future<void> main() async {  print('Fetching user order...');  print(await createOrderMessage()); }

Future

上面我們?cè)谑褂胊sync和await的過程中使用到了Future。在java中Future表示的是線程的執(zhí)行結(jié)果。在dart中Future表示的是一個(gè)異步執(zhí)行的結(jié)果。

Future有兩種狀態(tài):uncompleted 或者 completed。

當(dāng)最開始執(zhí)行一個(gè)異步函數(shù)的時(shí)候,會(huì)返回一個(gè)未完成的Future。這個(gè)未完成的Future會(huì)等等異步執(zhí)行的完成或者失敗。

不管異步程序是成功還是失敗,最終都會(huì)返回一個(gè)完成狀態(tài)。

async返回的Future可以接泛型,表示的時(shí)候返回的具體類型,比如Future 表示的是返回一個(gè)字符串,而 Future表示不返回任何值。

下面是兩個(gè)不同返回的例子:

Future<String> fetchUserOrder() {  return Future.delayed(const Duration(seconds: 2), () => 'Large Latte'); } Future<void> fetchUserOrder() {  return Future.delayed(const Duration(seconds: 2), () => print('Large Latte')); }

下面是一個(gè)異常的例子:

Future<void> fetchUserOrder() {  return Future.delayed(const Duration(seconds: 2),  () => throw Exception('Logout failed: user ID is invalid')); }

異步異常處理

在async的函數(shù)中,對(duì)await的異步方法中拋出的異常,可以直接是用try catch來進(jìn)行異常的捕獲:

try {  print('Awaiting user order...');  var order = await fetchUserOrder(); } catch (err) {  print('Caught error: $err'); }

在同步函數(shù)中調(diào)用異步函數(shù)

上面介紹的fetchUserOrder()返回的是一個(gè)Future,表示的是一個(gè)異步執(zhí)行的過程。

那么如果是一個(gè)同步的方法,比如main()函數(shù)中,如何去調(diào)用異步方法,并且得到返回值呢?

await肯定是不行的,因?yàn)閍wait只能在async的方法中調(diào)用。這個(gè)時(shí)候就可以用到then語句:

fetchUserOrder().then(order=>'do something');

then語句會(huì)等待異步執(zhí)行返回結(jié)果,然后對(duì)結(jié)果進(jìn)行處理,實(shí)際上就等同于javascript中的回調(diào)。

總結(jié)

以上就是dart中async和await的用法。