我正在尝试在幼虫应用程序中使用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
答案 0 :(得分:1)
\SleepWaitHandle
实际上不存在。完全限定的类名是\HH\SleepWaitHandle
(或者\HH\Asio\SleepWaitHandle
,我不太记得)。如果您注意到,所有示例都省略了前导\
- 在Hack代码中,如果没有冲突的类名,则会将几个类(例如SleepWaitHandle
)自动导入到当前命名空间中。您需要使用此行为,或使用正确的完全限定名称。run
的参数应为array<WaitHandle<string>> $handles
。我在博文中更新了这个例子。这是一个奇怪的例子 - 你通常不直接使用AwaitAllWaitHandle
;相反,您应该使用\HH\Asio\v()
和\HH\Asio\m()
函数,可能得到官方asio-utilities composer package的支持。