Hack 的异步特性 async 和 await

简介: 异步编程是一种编程的设计模式。它允许多个独立的任务协同工作,在同一线程内传递控制权。从最小依赖和任务交互的角度来看,这些任务是相互独立的。异步编程最常用于I/O读写。Hack使用async和await两个关键词支持异步编程。async声明异步函数。await会挂起一个异步函数的执行,直到await代表的异步操作的结果可以访问。await可以使用的函数的返回值为实现了Awaitable<T>的对象。

异步编程是一种编程的设计模式。它允许多个独立的任务协同工作,在同一线程内传递控制权。从最小依赖和任务交互的角度来看,这些任务是相互独立的。异步编程最常用于I/O读写。


Hack使用asyncawait两个关键词支持异步编程。async声明异步函数。await会挂起一个异步函数的执行,直到await代表的异步操作的结果可以访问。await可以使用的函数的返回值为实现了Awaitable<T>的对象。


<?hh

classFoo{}

classBar {

 publicfunctiongetFoo(): Foo {

   returnnew Foo();

 }

}

async functiongen_foo(int$a): Awaitable<?Foo> {

 if ($a === 0) {

   returnnull;

 }

 $bar = await gen_bar($a);

 if ($bar !== null) {

   return$bar->getFoo();

 }

 returnnull;

}

async functiongen_bar(int$a): Awaitable<?Bar> {

 if ($a === 0) {

   returnnull;

 }

 returnnew Bar();

}

gen_foo(4);

gen_foo()前有async关键字,因此它是一个异步函数。异步函数总是返回一个实现了Awaitable<T>的对象(通常具体的实现是WaitHandle<T>,不过几乎在所有场合都推荐使用Awaitable<T>接口。


调用gen_foo()会引入一些有趣的属性,这些都是异步函数特有的。异步函数可能会贪婪地执行异步函数体部分。调用gen_bar()首先返回一个Awaitable对象,这个对象在执行之中可能完成,也可能不完成。如果它没有完成,那么gen_foo()会挂起执行,否则gen_foo()会析构结果并继续贪婪执行。在await声明以外的执行不会被挂起。异步编程框架会记录所有应该完成的异步操作。

相关文章
|
11天前
|
前端开发
Await和Async是什么?跟Promise有什么区别 使用它有什么好处
Await和Async是什么?跟Promise有什么区别 使用它有什么好处
|
25天前
|
JavaScript 前端开发
js开发:请解释什么是ES6的async/await,以及它如何解决回调地狱问题。
ES6的`async/await`是基于Promise的异步编程工具,能以同步风格编写异步代码,提高代码可读性。它缓解了回调地狱问题,通过将异步操作封装为Promise,避免回调嵌套。错误处理更直观,类似同步的try...catch。
|
1月前
|
C#
C#学习系列相关之多线程(四)----async和await的用法
C#学习系列相关之多线程(四)----async和await的用法
|
3月前
|
前端开发 JavaScript API
快速入门JavaScript异步编程:从回调到async/await的跨越
快速入门JavaScript异步编程:从回调到async/await的跨越
|
4月前
|
前端开发 JavaScript
JavaScript开发中ES6+新特性:简述async/await的用法。
JavaScript开发中ES6+新特性:简述async/await的用法。
32 0
|
4月前
|
监控 前端开发 JavaScript
async/await:使用同步的方式去写异步代码
async/await:使用同步的方式去写异步代码
53 1
|
7月前
|
前端开发
前端(十二)——深入理解和使用 async和await
前端(十二)——深入理解和使用 async和await
|
8月前
|
前端开发 JavaScript
async、await 实现原理
async、await 实现原理
51 1
|
11月前
|
前端开发 JavaScript Python
|
11月前
|
小程序 前端开发
小程序里使用es7的async await语法
小程序里使用es7的async await语法