異步編程是一種編程的設計模式。它容許多個獨立的任務協同工做,在同一線程內傳遞控制權。從最小依賴和任務交互的角度來看,這些任務是相互獨立的。異步編程最經常使用於I/O讀寫。php
Hack使用async
和await
兩個關鍵詞支持異步編程。async
聲明異步函數。await
會掛起一個異步函數的執行,直到await
表明的異步操做的結果能夠訪問。await
能夠使用的函數的返回值爲實現了Awaitable<T>
的對象。編程
<?hh class Foo{} class Bar { public function getFoo(): Foo { return new Foo(); } } async function gen_foo(int $a): Awaitable<?Foo> { if ($a === 0) { return null; } $bar = await gen_bar($a); if ($bar !== null) { return $bar->getFoo(); } return null; } async function gen_bar(int $a): Awaitable<?Bar> { if ($a === 0) { return null; } return new Bar(); } gen_foo(4);
gen_foo()
前有async
關鍵字,所以它是一個異步函數。異步函數老是返回一個實現了Awaitable<T>
的對象(一般具體的實現是WaitHandle<T>
,不過幾乎在全部場合都推薦使用Awaitable<T>
接口。設計模式
調用gen_foo()
會引入一些有趣的屬性,這些都是異步函數特有的。異步函數可能會貪婪地執行異步函數體部分。調用gen_bar()
首先返回一個Awaitable
對象,這個對象在執行之中可能完成,也可能不完成。若是它沒有完成,那麼gen_foo()
會掛起執行,不然gen_foo()
會析構結果並繼續貪婪執行。在await
聲明之外的執行不會被掛起。異步編程框架會記錄全部應該完成的異步操做。框架
原文 Hack Language Reference -- async and await
翻譯 SegmentFault異步