dart線程之怎么處理異步和順序異步任務隊列
單線程的dart怎么處理異步任務的?
- 事件循環模型就是實現異步處理任務的核心。
關于阻塞式調用和非阻塞式調用的概念
- 阻塞和非阻塞關注的是程序在等待調用結果(消息、返回值)時的狀態
- 阻塞式調用: 調用結果返回之前,當前線程會被掛起,調用線程只有在得到調用結果之后才會繼續執行
- 非阻塞式調用: 調用執行后,當前線程不會停止執行,只需要過一段時間來檢查一下有沒有結果返回即可
對于順序異步怎么實現
通過Future的then鏈式調用
示例:
import 'dart:io';main(List<String> args) {print("main start");Future((){//1.發送第一次請求sleep(Duration(seconds:8));return "第一次的結果";}).then((value){print(value);//2.發送的第二次請求sleep(Duration(seconds:3));//return "第二次的結果";throw Exception("第二次請求異常");}).then((value){print(value);}).catchError((err){print(err);}).whenComplete(() => {print("代碼完成")});print("main end");
}
通過連續的await
- await等待該操作結果,所以等待完繼續下一個也能實現順序異步
示例:
Future getData() async{//1.調用第一次網絡請求var res1 = await getNetworkData("argument1");print(res1);var res2 = await getNetworkData(res1);print(res2);var res3 = await getNetworkData(res2);print(res3);return res3;
}
await、async的意義
- 用同步的代碼格式,去實現異步的調用過程
- await需要寫在耗時操作之前,表示等待該操作結果
備注:通過查閱一些資料整理所得,如有錯誤,煩請指正。