99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Async實(shí)用功能

2018-10-10 11:16 更新

Async可以與HHVM中的基本內(nèi)置基礎(chǔ)設(shè)施有效地使用。這個(gè)基礎(chǔ)設(shè)施包括:

async,await,Awaitable
HH\Asio\v(), HH\Asio\m()

但是,有些情況下,您希望將某些值的值轉(zhuǎn)換為等待值,或者您想從等待的集合中過濾一些等待時(shí)間。當(dāng)您創(chuàng)建多個(gè)等待并行的等待時(shí)間時(shí),會(huì)出現(xiàn)這些類型的場景。

您可以使用類似的功能array_filter(),或者Hack集合類的方法等進(jìn)行映射和過濾。然而,有一組實(shí)用功能,專門為Async創(chuàng)建,這將使您的代碼更加精簡。

注意:這些功能內(nèi)置于HHVM 3.11及更高版本。如果您使用的HHVM版本小于3.11,您可以添加hhvm/asio-utilities到您的composer.json文件,因?yàn)檫@些功能可以在hhvm/asio-utilitiesGithub repo中使用

NAMERETURNSMAPPEDFILTEREDHAS KEYWRAPPED EXCEPTION
HH\Asio\vm()Vector<Tv>?xxx
HH\Asio\vmk()Vector<Tv>?x?x
HH\Asio\vf()Vector<Tv>x?xx
HH\Asio\vfk()Vector<Tv>x??x
HH\Asio\vw()Vector<ResultOrExceptionWrapper<Tv>>xxx?
HH\Asio\vmw()Vector<ResultOrExceptionWrapper<Tv>>?xx?
HH\Asio\vmkw()Vector<ResultOrExceptionWrapper<Tv>>?x??
HH\Asio\vfw()Vector<ResultOrExceptionWrapper<Tv>>x?x?
HH\Asio\vfkw()Vector<ResultOrExceptionWrapper<Tv>>x???
HH\Asio\m()Map<Tk, Tv>xxxx
HH\Asio\mm()Map<Tk, Tv>?xxx
HH\Asio\mmk()Map<Tk, Tv>?x?x
HH\Asio\mf()Map<Tk, Tv>x?xx
HH\Asio\mfk()Map<Tk, Tv>x??x
HH\Asio\mw()Map<Tk, ResultOrExceptionWrapper<Tv>>?xx?
HH\Asio\mmw()Map<Tk, ResultOrExceptionWrapper<Tv>>?xx?
HH\Asio\mmkw()Map<Tk, ResultOrExceptionWrapper<Tv>>?x??
HH\Asio\mfw()Map<Tk, ResultOrExceptionWrapper<Tv>>x?x?
HH\Asio\mfkw()Map<Tk, ResultOrExceptionWrapper<Tv>>x???

在函數(shù)名中從左到右,這里是這些字母所代表的:

第一

v: Vector
m: Map

二,三

f: filter
fk: filter with key
m: map
mk: map with keys

第四

w: result or exception wrapper.

其他方便功能

除了上述基于集合的效用函數(shù)之外,還有另外三個(gè)方便的功能專門用于Async。

NAMERETURNSDESCRIPTION
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è)你有以下幾點(diǎn):

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);
}

你想要這樣做正確鍵入檢查。但是,你會(huì)得到如下的東西:

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

那是因?yàn)?a href="http://www.15014759268.cn/targetlink?url=https://github.com/hhvm/asio-utilities" target="_blank">HH\Asio\v()需要一個(gè)Traversable<Awaitable<T>>并返回一個(gè)Awaitable<Vector<T>>。沒有T一個(gè)可以是一個(gè)X和一個(gè)int。因此,類型檢查器基本上會(huì)拋出手,并創(chuàng)建某種聯(lián)合類型,T以嘗試表示這兩者。

但是,當(dāng)你想返回的時(shí)候tuple($a, $b),$a是一個(gè)X,b是一個(gè)int,但是類型檢查器沒有意識(shí)到,因?yàn)樗J(rèn)為這些應(yīng)該是上面創(chuàng)建的混合聯(lián)合類型。

所以我們需要明確地?cái)嘌晕覀兯赖氖菫榱耸诡愋蜋z查器開心。

assert ($a instanceof X);
assert (is_int($b));
return tuple($a, $b);

在未來將會(huì)有一個(gè)可變參數(shù)的功能HH\Asio\va(),更好地支持這種模式。例如,

va(Awaitable<T1>, Awaitable<T2>, ..., Awaitable<Tn>): Awaitable<(T1, T2, T3)>

而不是混亂的聯(lián)盟,把我們弄亂了以上。

創(chuàng)建自己的解決方法功能

直到HH\Asio\va()完全支持,您可以創(chuàng)建自己的版本的幫助函數(shù),其作用類似。以下示例需要兩個(gè)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]);
}

有趣的是,上述功能實(shí)際上是在生成Hack和HHVM文檔站點(diǎn)的代碼中實(shí)現(xiàn)的。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)