【Flutter 1-13】Flutter手把手教程Dart語言——非同步、Future、Stream、async、await詳解
作者 | 弗拉德
來源 | 弗拉德(公眾號:fulade_me)
非同步
Dart 程式碼庫中有大量返回Future
或Stream
物件的函式,這些函式都是非同步的,它們會在耗時操作執行完畢前直接返回而不會等待耗時操作執行完畢。
async
和await
關鍵字用於實現非同步程式設計,並且讓你的程式碼看起來就像是同步的一樣。
Future
可以通過下面兩種方式,獲得Future
執行完成的結果:
- 使用
async
和await
; - 使用
Future API
;
使用async
和await
的程式碼是非同步的,但是看起來有點像同步程式碼。例如,下面的程式碼使用await
等待非同步函式的執行結果。
await lookUpVersion();
必須在帶有async
關鍵字的非同步函式中使用 await
:
Future checkVersion() async {
var version = await lookUpVersion();
// 使用 version 繼續處理邏輯
}
儘管非同步函式可以處理耗時操作,但是它並不會等待這些耗時操作完成,非同步函式執行時會在其遇到第一個 await
表示式的時候返回一個Future
物件,然後等待await
表示式執行完畢後繼續執行。
使用try
、catch
以及finally
來處理使用await
導致的異常:
try {
version = await lookUpVersion();
} catch (e) {
// 無法找到版本時做出的反應
}
你可以在非同步函式中多次使用await
關鍵字。例如,下面程式碼中等待了三次函式結果:
var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);
await
表示式的返回值通常是一個Future
物件;
如果不是的話也會自動將其包裹在一個Future
物件裡。Future
物件代表一個"承諾",await
表示式會阻塞直到需要的物件返回。
如果在使用await
時導致編譯錯誤,請確保await
在一個非同步函式中使用。例如,如果想在main()
函式中使用await
,那麼main()
函式就必須使用async
關鍵字標識。
Future main() async {
checkVersion();
print('在 Main 函式中執行:版本是 ${await lookUpVersion()}');
}
宣告非同步函式
定義非同步函式只需在普通方法上加上async
關鍵字即可。
將關鍵字async
新增到函式並讓其返回一個Future
物件。假設有如下返回String
物件的方法:
String lookUpVersion() => '1.0.0';
將其改為非同步函式,返回值是Future
:
Future<String> lookUpVersion() async => '1.0.0';
注意,函式體不需要使用Future API
。如有必要,Dart
會建立Future
物件。
如果函式沒有返回有效值,需要設定其返回型別為 Future<void>
Stream
Stream
也是用於接收非同步事件資料,和Future
不同的是,它可以接收多個非同步操作的結果(成功或失敗)。 也就是說,在執行非同步任務時,可以通過多次觸發成功或失敗事件來傳遞結果資料或錯誤異常。Stream
常用於會多次讀取資料的非同步任務場景,如網路內容下載、檔案讀寫等。舉個例子:
Stream.fromFutures([
// 1秒後返回結果
Future.delayed(new Duration(seconds: 1), () {
return "hello 1";
}),
// 丟擲一個異常
Future.delayed(new Duration(seconds: 2),(){
throw AssertionError("Error");
}),
// 3秒後返回結果
Future.delayed(new Duration(seconds: 3), () {
return "hello 3";
})
]).listen((data){
print(data);
}, onError: (e){
print(e.message);
},onDone: (){
});
上面的程式碼依次會輸出:
hello 1
Error
hello 3
相關文章
- [Flutter]Dart Future詳解FlutterDart
- Dart 語言非同步之Stream詳解Dart非同步
- Flutter教程(二) 瞭解Dart語言FlutterDart
- flutter實戰5:非同步async、await和Future的使用技巧Flutter非同步AI
- Flutter&Dart-非同步程式設計Future、Stream極速入門FlutterDart非同步程式設計
- 【-Flutter/Dart 語法補遺-】 sync* 和 async* 、yield 和yield* 、async 和 awaitFlutterDartAI
- 【Flutter 1-7】Flutter教程Dart語言——變數FlutterDart變數
- Flutter非同步程式設計-async和awaitFlutter非同步程式設計AI
- flutter【3】dart語言--方法FlutterDart
- Flutter小白教程系列(三) --- Dart語言快速入門FlutterDart
- Flutter系列之Dart語言概述FlutterDart
- [Flutter翻譯]Flutter/Dart非阻塞解惑FlutterDart
- flutter【1】-dart語言--基本知識FlutterDart
- flutter【4】dart語言--操作符FlutterDart
- Flutter學習指南:熟悉Dart語言FlutterDart
- (六)Flutter學習之Dart非同步操作詳解FlutterDart非同步
- Flutter (二) Dart 語言基礎詳解 (異常,類,Mixin, 泛型,庫)FlutterDart泛型
- async await詳解AI
- Flutter (三) Dart 語言基礎詳解 (非同步,生成器,隔離,後設資料,註釋)FlutterDart非同步
- Flutter開發之Dart語言基礎FlutterDart
- Flutter非同步程式設計-FutureFlutter非同步程式設計
- Flutter中Dart非同步模型FlutterDart非同步模型
- Flutter/Dart中的非同步FlutterDart非同步
- Flutter - Dart特性語法FlutterDart
- 【Flutter 專題】91 圖解 Dart 單執行緒實現非同步處理之 Future (二)Flutter圖解Dart執行緒非同步
- async/await使用深入詳解AI
- Promise和async await詳解PromiseAI
- flutter【2】dart語言--內建資料型別FlutterDart資料型別
- Flutter學習筆記(2)--Dart語言簡介Flutter筆記Dart
- Dart語言詳解(二)——基本語法Dart
- Flutter非同步程式設計-StreamFlutter非同步程式設計
- Flutter Dart語法學習FlutterDart
- JavaScript中的async/await詳解JavaScriptAI
- Dart語言詳解(一)——詳細介紹Dart
- Flutter非同步程式設計詳解Flutter非同步程式設計
- Flutter(五)之徹底搞懂Dart非同步FlutterDart非同步
- Dart4Flutter – 04 – 非同步和庫DartFlutter非同步
- 非同步神器async-await非同步AI