codecamp

Async实用功能

Async可以与HHVM中的基本内置基础设施有效地使用。这个基础设施包括:

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

但是,有些情况下,您希望将某些值的值转换为等待值,或者您想从等待的集合中过滤一些等待时间。当您创建多个等待并行的等待时间时,会出现这些类型的场景。

您可以使用类似的功能array_filter(),或者Hack集合类的方法等进行映射和过滤。然而,有一组实用功能,专门为Async创建,这将使您的代码更加精简。

注意:这些功能内置于HHVM 3.11及更高版本。如果您使用的HHVM版本小于3.11,您可以添加hhvm/asio-utilities到您的composer.json文件,因为这些功能可以在hhvm/asio-utilitiesGithub repo中使用

NAMERETURNSMAPPEDFILTEREDHAS KEYWRAPPED EXCEPTION
HH\Asio\vm()Vector<Tv>xxx
HH\Asio\vmk()Vector<Tv>xx
HH\Asio\vf()Vector<Tv>xxx
HH\Asio\vfk()Vector<Tv>xx
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>>xx
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>xx
HH\Asio\mf()Map<Tk, Tv>xxx
HH\Asio\mfk()Map<Tk, Tv>xx
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>>xx
HH\Asio\mfkw()Map<Tk, ResultOrExceptionWrapper<Tv>>x

在函数名中从左到右,这里是这些字母所代表的:

第一

v: Vector
m: Map

二,三

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

第四

w: result or exception wrapper.

其他方便功能

除了上述基于集合的效用函数之外,还有另外三个方便的功能专门用于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.

类型检查

假设你有以下几点:

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。因此,类型检查器基本上会抛出手,并创建某种联合类型,T以尝试表示这两者。

但是,当你想返回的时候tuple($a, $b),$a是一个X,b是一个int,但是类型检查器没有意识到,因为它认为这些应该是上面创建的混合联合类型。

所以我们需要明确地断言我们所知道的是为了使类型检查器开心。

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

在未来将会有一个可变参数的功能HH\Asio\va(),更好地支持这种模式。例如,

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

而不是混乱的联盟,把我们弄乱了以上。

创建自己的解决方法功能

直到HH\Asio\va()完全支持,您可以创建自己的版本的帮助函数,其作用类似。以下示例需要两个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文档站点的代码中实现的。


Async Blocks
Async扩展
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }