天天看點

Hack 的異步特性 async 和 await

異步程式設計是一種程式設計的設計模式。它允許多個獨立的任務協同工作,在同一線程内傳遞控制權。從最小依賴和任務互動的角度來看,這些任務是互相獨立的。異步程式設計最常用于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

聲明以外的執行不會被挂起。異步程式設計架構會記錄所有應該完成的異步操作。

繼續閱讀