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的程式内容。