Dart語言面向對象程式設計
- 異步
-
- Future
-
- 1.異步讀檔案
- 2.同步讀檔案
- async和await
- Stream
異步
Future
Future表示在将來某時擷取一個值的方式,當一個傳回Future方法被調用時,該方法會把要執行的某事件放入隊列,并傳回一個未完成的Future對象,在該事件執行完畢後,Future對象的狀态會自動變成已經完成,此時可以通過then鍊式調用或async和await擷取該事件的傳回值,并對傳回值進行相應處理。
例:定義1個從指定檔案異步讀出檔案内容的方法,并将檔案内容輸出。
1.異步讀檔案
Dart語言中通過File對象的readAsSting()方法異步讀取檔案,該方法傳回的一個Future<String>對象,Future有一個then方法,該方法如下:
Future<R> then<R>(
FutureOr<R> onValue(
T value
),{
Function onError
});
2.同步讀檔案
Dart語言中同樣也提供了同步讀檔案機制,即調用File類的同步讀檔案方法readAsStringSync()讀檔案時,需要等檔案讀完後才能執行後面的功能子產品。
例:定義1個從指定檔案同步讀出檔案内容的方法,并将檔案内容輸出。
(1)定義readFileSync()方法
String readFileSync(String filePath){
File file = File(filePath);
return file.readAsStringSync();
}
(2)定義main()方法
void main(){
print('start');
String info = readFileSync("temp/info.txt");
print(info); //輸出讀出的檔案内容
print('end');
}
async和await
Dart語言中提供了async和await機制,讓異步任務的執行看起來和同步代碼的執行順序一緻。
async用來表示定義的方法是異步執行的,該方法會傳回一個Future對象;await後面也是一個Future對象,表示該異步任務完成,隻有異步任務執行完成後才會繼續執行後面的任務代碼。
async的作用就是标記一個方法是異步方法;await的作用是等待異步任務的結果。
例:用async和await機制實作異步讀檔案,并産生如前例所示輸出效果:
void mian() async {
print('start');
String info = await reaFile("temp/info.txt");
print(info);
print('end');
}
使用async和await實作代碼異步執行機制包含以下四個要點:
(1)await隻能在标記了async的異步方法中使用,否則報錯;
(2)當使用async作為方法名字尾聲明時,說明這個方法的傳回值是一個Future類型;
(3)當執行到該方法中用await标注的代碼時,會暫停該方法其他部分的代碼執行;
(4)當await标注的代碼引用的Future類型傳回值執行完成,await标注的代碼後的下一行代碼會立即執行。
Stream
Stream和Future是Dart語言實作異步處理機制的核心API,用Future實作異步處理時,所有異步操作的傳回值都是有Future表示,但是Future隻能表示一次異步獲得的資料,而Stream實作異步事件流的處理,它表示多次異步獲得的資料。
采用Stream方式讀檔案内容時,一般情況下每次可以讀取一部分資料,并進行相應的處理。
例:定義1個用Stream方式從指定檔案讀出檔案内容的方法,并将檔案内容輸出。
openRead()方法傳回一個Sream<List<int>>類型的資料,也就是一個存放了int類型數組的資料流。在獲得一個Stream執行個體對象後,就是通過listen()方法訂閱Stream上發出的資料(即事件),有事件發出時就會通知訂閱者進行相應的事件處理。listen()方法如下:
StreamSubscription<T> listen(
void onData(T event),
{
Function onError,
void onDone(),
bool cancelOnError}
);