0

我正在尝试在 larval 应用程序中使用 HHVM 的异步函数。我在函数中添加了 async 关键字,但在等待 SleepWaitHandle 时出现错误。它说这个类是未定义的。文档似乎没有对此进行更改。我错过了什么?

await \SleepWaitHandle::create(\DB::table('submissions')->insert($submissions_for_insert));

我在每晚 3.9 和 3.8 的马厩上发生了这种情况。运行 ubuntu 14.10。

我尝试从http://hhvm.com/blog/7091/async-cooperative-multitasking-for-hack运行一个演示

<?hh

async function hello(): Awaitable<string> {
  return "Hello World";
}
async function goodbye(): Awaitable<string> {
  return "Goodbye, everybody!";
}
async function run(
  array<Awaitable<string>> $handles,
): Awaitable<array<string>> {
  await AwaitAllWaitHandle::fromArray($handles);
  return array_map($handle ==> $handle->result(), $handles);
}
$results = run(array(hello(), goodbye()))->getWaitHandle()->join();
print_r($results);
// Array
// (
//  [0] => Hello World
//  [1] => Goodbye, everybody!
// )

但是在命令行上运行它会返回

Catchable fatal error: Hack type error: Invalid argument at /test/asyn.php line 12
4

1 回答 1

1
  • 给你的第一个问题:\SleepWaitHandle其实不存在。完全限定的类名是\HH\SleepWaitHandle(或者也许\HH\Asio\SleepWaitHandle,我不太记得了)。如果您注意到,所有示例都省略了开头的-- 在 Hack 代码中,如果没有冲突的类名\,几个类(例如)会自动导入到您当前的命名空间中。SleepWaitHandle您需要使用此行为,或使用正确的完全限定名称。
  • 对于您的第二个问题,这是博客示例中的一个错误——哎呀!的参数run应该是array<WaitHandle<string>> $handles。我已经更新了博客文章中的示例。这是一个奇怪的例子——你通常不AwaitAllWaitHandle直接使用;相反,您应该使用\HH\Asio\v()and\HH\Asio\m()函数,也许在官方asio-utilities composer package的支持下。
于 2015-07-22T17:30:08.200 回答