天天看點

Dart語言學習日記(九)異步

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}
);