Dart 是屬於單一執行緒的程式語言,也就是說所有的程式碼都運行於同一個執行緒中,若是遇到如I/O操作或是http這種需要較長時間的操作時,將會阻礙執行緒的執行。不過可以透過Future實現非同步的開發,將Future 與 async、await 結合開發非同步程式。
通過下面的例子來理解這個概念,I/O操作接受使用者輸入
mport 'dart:io';
void main() {
print('Enter your name :');
// prompt for user input
String name = stdin.readLineSync();
// this is a synchronous method that reads user input
print('Hello Mr. $name');
print('End of main');
}
readLineSync()是一同步函式。它將阻止執行readLineSync()函式呼叫之後的所有指令,直到readLineSync()完成執行。
stdin.readLineSync等待輸入。它停止執行並且在收到使用者輸入之前不再執行任何操作。
由這個例子可以看出,同步執行將會導致長時間的等待,並延緩程式執行的效率。
非同步程式設計基本上意味著沒有等待或非阻塞程式的設計模型。導入 dart:async 可以實現非同步程式設計。
Future類別是屬於dart:async,定義為「在未來的某個時間獲取值的方法」。簡單地說,Future物件是一種表示由表示式回傳值的機制,該表示式的執行將在稍後的時間點完成。
舉一個讀取檔案,使用非同步的例子如下:
先做一個文字檔contact.txt 內容如下
1, One
2, Two
3, Three
4, Four
開始撰寫非同步程式
void main(){
var file = File( Directory.current.path+'\\contact.txt');
Future<String> f = file.readAsString();
// returns a futrue, this is Async method
f.then((data)=>print(data));
// once file is read , call back method is invoked
print('End of main');
// this get printed first, showing fileReading is non blocking or async
}
當指令碼執行時,呼叫readAsString非同步讀取檔案,因為讀取檔案操作可能需要很多時間,因此利用非同步的做法讓程式繼續執行,馬上接著印出「End of main」,之後一直等到非同步任務完成,在完成取值後才會執行then的程式內容。