異步程式設計是一種程式設計的設計模式。它允許多個獨立的任務協同工作,在同一線程内傳遞控制權。從最小依賴和任務互動的角度來看,這些任務是互相獨立的。異步程式設計最常用于I/O讀寫。
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> {
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
聲明以外的執行不會被挂起。異步程式設計架構會記錄所有應該完成的異步操作。