Hack 的異步特性 async 和 await

異步編程是一種編程的設計模式。它容許多個獨立的任務協同工做,在同一線程內傳遞控制權。從最小依賴和任務交互的角度來看,這些任務是相互獨立的。異步編程最經常使用於I/O讀寫。php

Hack使用asyncawait兩個關鍵詞支持異步編程。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異步

相關文章
相關標籤/搜索