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异步

相关文章
相关标签/搜索