W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Async可以與HHVM中的基本內(nèi)置基礎(chǔ)設(shè)施有效地使用。這個基礎(chǔ)設(shè)施包括:
async,await,Awaitable
HH\Asio\v(), HH\Asio\m()
但是,有些情況下,您希望將某些值的值轉(zhuǎn)換為等待值,或者您想從等待的集合中過濾一些等待時間。當您創(chuàng)建多個等待并行的等待時間時,會出現(xiàn)這些類型的場景。
您可以使用類似的功能array_filter(),或者Hack集合類的方法等進行映射和過濾。然而,有一組實用功能,專門為Async創(chuàng)建,這將使您的代碼更加精簡。
注意:這些功能內(nèi)置于HHVM 3.11及更高版本。如果您使用的HHVM版本小于3.11,您可以添加hhvm/asio-utilities到您的composer.json文件,因為這些功能可以在hhvm/asio-utilitiesGithub repo中使用。
在函數(shù)名中從左到右,這里是這些字母所代表的:
第一
v: Vector
m: Map
二,三
f: filter
fk: filter with key
m: map
mk: map with keys
第四
w: result or exception wrapper.
除了上述基于集合的效用函數(shù)之外,還有另外三個方便的功能專門用于Async。
NAME | RETURNS | DESCRIPTION |
---|---|---|
HH\Asio\usleep(int) | Awaitable<void> | Wait a provided length of time before an async function does more work. |
HH\Asio\later() | Awaitable<void> | Reschedule the work of an async function until some undetermined point in the future. |
HH\Asio\wrap(Awaitable<Tv>) | Awaitable<ResultOrExceptionWrapper<Tv>> | Wrap an Awaitable into an Awaitable of ResultOrExceptionWrapper . |
假設(shè)你有以下幾點:
async function baz(): Awaitable<(X, int)> {
list ($a, $b) =
await \HH\Asio\v(array(
returns_an_X($foo),
returns_an_int($bar),
));
return tuple($a, $b);
}
你想要這樣做正確鍵入檢查。但是,你會得到如下的東西:
example.php:60:12,44: Invalid return type (Typing[4110])
example.php:36:60,67: This is an object of type X
example.php:25:61,63: It is incompatible with an int
那是因為HH\Asio\v()需要一個Traversable<Awaitable<T>>并返回一個Awaitable<Vector<T>>。沒有T一個可以是一個X和一個int。因此,類型檢查器基本上會拋出手,并創(chuàng)建某種聯(lián)合類型,T以嘗試表示這兩者。
但是,當你想返回的時候tuple($a, $b),$a是一個X,b是一個int,但是類型檢查器沒有意識到,因為它認為這些應(yīng)該是上面創(chuàng)建的混合聯(lián)合類型。
所以我們需要明確地斷言我們所知道的是為了使類型檢查器開心。
assert ($a instanceof X);
assert (is_int($b));
return tuple($a, $b);
在未來將會有一個可變參數(shù)的功能HH\Asio\va()
,更好地支持這種模式。例如,
va(Awaitable<T1>, Awaitable<T2>, ..., Awaitable<Tn>): Awaitable<(T1, T2, T3)>
而不是混亂的聯(lián)盟,把我們弄亂了以上。
直到HH\Asio\va()完全支持,您可以創(chuàng)建自己的版本的幫助函數(shù),其作用類似。以下示例需要兩個Awaitable可能不同的類型,如上所述,返回tuple這兩種類型。在這種情況下,您不需要任何asserts等
<?hh // strict
// Replace calls to these with calls to HH\Asio\va() when that is implemented
async function va2<Ta,Tb>(
Awaitable<Ta> $a,
Awaitable<Tb> $b,
): Awaitable<(Ta, Tb)> {
$list = await v(Vector{$a, $b});
// UNSAFE
return tuple($list[0], $list[1]);
}
有趣的是,上述功能實際上是在生成Hack和HHVM文檔站點的代碼中實現(xiàn)的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: