Async Blocks
2018-10-10 11:06 更新
在一个冗长的Async功能中,通常一个好主意将与其余功能无关的数据读取分组在一起。这减少了不必要的等待I / O。
为了将这个分组内联,你通常必须使用一个帮助函数。Async Blocks允许立即执行代码分组,可能在零参数,Async lambdas中。
语法
Async Blocks的语法是:
async {
// grouped together calls, usually await.
< statements >
}
用法
Async Blocks有两个主要用例。记住这是基本上合成糖,使你的生活更轻松。
- 在需要一个函数调用执行之前的内联简单Async语句。
- 替换async lambda所需的调用返回一个实际的Awaitable<T>。
<?hh
namespace Hack\UserDocumentation\Async\Blocks\Examples\SyntaticSugar;
async function gen_int(): Awaitable<int> {
return 4;
}
async function gen_float(): Awaitable<float> {
return 1.2;
}
async function gen_string(): Awaitable<string> {
return "Hello";
}
async function gen_call<Tv>((function (): Awaitable<Tv>) $gen): Awaitable<Tv> {
return await $gen();
}
async function use_async_lambda(): Awaitable<void> {
// To use an async lambda with no arguments, you would need to have a helper
// function to return an actual Awaitable for you.
$x = await gen_call(
async () ==> {
$y = await gen_float();
$z = await gen_int();
return round($y) + $z;
}
);
var_dump($x);
}
async function use_async_block(): Awaitable<void> {
// With an async block, no helper function needed. It is all built-in to the
// async block itself.
$x = await async {
$y = await gen_float();
$z = await gen_int();
return round($y) + $z;
};
var_dump($x);
}
async function call_async_function(): Awaitable<void> {
// Normally you have to call a simple async function and get its value, even
// if it takes no arguments, etc.
$x = await gen_string();
var_dump($x);
}
async function use_async_block_2(): Awaitable<void> {
// Here you can inline your function right in the async block
$x = await async { return "Hello"; };
var_dump($x);
}
\HH\Asio\join(use_async_lambda());
\HH\Asio\join(use_async_block());
\HH\Asio\join(call_async_function());
\HH\Asio\join(use_async_block_2());
Output
float(5)
float(5)
string(5) "Hello"
string(5) "Hello"
限制
类型检查器不允许==>在lambda 的右侧立即使用异步块。
在使用function关键字声明的Async函数中,async紧接在前面function,而这些紧跟在参数之前。在异步lambdas中,async也立即在参数之前。
所以:
$ x = async()==> {...} // good
$ x =()==> async {...} // bad
基本上这只是一个安全警卫,以减少意外行为的可能性。
以上内容是否对您有帮助:
更多建议: