Dart官方文檔:https://dart.dev/language/async
重要説明:本博客基於Dart官網文檔,但並不是簡單的對官網進行翻譯,在覆蓋核心功能情況下,我會根據個人研發經驗,加入自己的一些擴展問題和場景驗證。
Future處理
我們有2種方式編寫Future異步代碼:
- 使用
async和wait關鍵字 - 使用Future API(https://dart.dev/guides/libraries/library-tour#future)
推薦使用async和wait關鍵字,讓異步代碼看起來和同步代碼一樣。
如下代碼樣例:wait關鍵字等待異步函數返回結果,它必須在async函數中。
Future<void> checkVersion() async {
var version = await lookUpVersion();
var exitCode = await findExitCode();
// ......
await flushThenExit(exitCode);
}
可以用try、catch和finally關鍵字處理錯誤和清理代碼:
try {
version = await lookUpVersion();
} catch (e) {
// React to inability to look up the version
} finally {
// Clean code
}
申明異步函數
使用async修飾一個函數體,這個函數就是異步函數,它的返回結果是一個Future<T>,當函數無需返回結果時,返回結果為Future<void>:
Future<String> lookUpVersion async {
// ......
return '1.0.1';
}
Future<void> doSomething() {
// ......
}
Stream處理
同樣的,我們也有2種方式編寫Stream代碼:
- 在異步循環使用
async異步關鍵字(await for) - 使用Stream API(https://dart.dev/guides/libraries/library-tour#stream)
推薦使用async關鍵字,異步循環的形式如下:
await for (varOrType identifier in expression) {
// ......
}
在上訴異步循環形式中,expression的值為一個Stream類型,異步循環的執行過程如下:
- 等待Stream產出一個值(即觸發循環執行)
- 設置identifier變量值,執行循環體邏輯
- 重複上面2步,直到Stream關閉(即循環結束)
我們可以通過break或者return語句,退出循環,從而中斷監聽Stream生產的值。
同樣的,異步循環的函數,必須使用async關鍵字修飾。如下所示,main()函數體使用了await for異步循環,則函數必須使用async修飾:
void main() async {
// ......
await for (final request in requestServer) {
handleRequest(request);
}
// ......
}
最後
- 第4課對異步編程文檔(Future和async/await):https://ntopic.cn/p/2023092901
- 其他更多關於異步編程信息,請求參考異步包
dart:async(https://dart.dev/guides/libraries/library-tour#dartasync---asynchronous-programming)
我的本博客原地址:https://ntopic.cn/p/2023111801