今天來簡單的聊聊dart裡處理非同步事件的兩個種類:Future和Stream
一般執行程式時會立刻回傳值,在大量計算或等待資料時,同步處理會卡在這個操作上,並等到完成計算才會進行下一步;而非同步處理,是在我們執行程式碼時,當無法在執行程式碼之後直接取得答案,此時非同步會先去執行其他的事情,當有結果時在獲取答案
而對於flutter,Dart在運行在單個執行“thread”中。如果Dart代碼在執行時阻塞,例如:處理一個需要長時間運行的計算操作或等待 I/O 完成。此時整個程序會被“freeze"。
並且Dart都運行在一個isolate的context環境中,並且isolate中擁有對應Dart代碼片段運行所需的所有內存。
Dart 代碼執行時不允許其它的代碼片段在與之相同的 isolate 中執行。當想在同一時間運行多個不同的Dart代碼,那麼就要將它們分別運行於不同的isolate
中。 (在Web則使用worker
替代isolate。)
而Future
用於處理單個非同步操作,Stream
用來處理連續的非同步操作
Future用在不會立即完成的計算。非同步函數返回一個Future,並只有當結果出來時才會告訴你。
Stream是一個非同步事件序列,他會一直做一個非同步循環,有可能無法在當下就跟Stream取得資料,但只要尚未停止取得事件,那麼就會在最新事件準備好時通知
當一個返回future的函數被調用時,當一個返回 future 對象的函數被調用時,會發生兩件事(未完成與完成):
如何使用?
async
(表示該函式是非同步函式)和await
(表示要等待非同步操作完成)