我想从PHP中的异步函数返回一个值...我在这里使用icicle.io,但我很乐意使用任何东西,只要它能做我想做的事情!无论如何,这是下面的一些代码
<?php
require __DIR__ . '/vendor/autoload.php';
use Icicle\Coroutine\Coroutine;
use Icicle\Loop;
function getArray($int) {
yield array ($int, $int + 1, $int + 2);
}
function getArrays() {
$numbers = array (1, 4, 7);
$results = array();
foreach ($numbers as $number) {
array_push($results, (yield(getArray($number))));
}
yield call_user_func_array('array_merge', $results);
}
$coroutine = new Coroutine(getArrays());
$data = $coroutine->then(
function ($result) {
$data = print_r($result, true);
return "Result: {$data}\n";
},
function (Exception $e) {
echo "Error: {$e->getMessage()}\n";
}
)->done(function ($value) {
echo $value;
});
Loop\run();
我真正喜欢做的是将最后一点放在一个函数中,所以看起来更像是这样:
function sync() {
$coroutine = new Coroutine(getArrays());
$data = $coroutine->then(
function ($result) {
$data = print_r($result, true);
return "Result: {$data}\n";
},
function (Exception $e) {
echo "Error: {$e->getMessage()}\n";
}
)->done(function ($value) {
return $value;
});
Loop\run();
return /* the value */;
}
然后从我的酷软件中,我可以调用sync(),就像它是一个同步函数一样,幸福地不知道幕后发生的异步恶作剧。
有没有人这样做过,或者对我的方式有一些建议?目前 best 我想出的是(ab)使用输出缓冲区&amp; serialize()
/ unserialize()
功能,但由于我是出于改善性能的一切愿望而做的,这似乎相当倒退!!
答案 0 :(得分:1)
您可以使用wait()
方法同步等待Awaitable(包括Coroutine)的分辨率。此方法勾选事件循环,直到协程解析为止。这意味着您的sync()
函数可以简单地在coroutine对象上调用此方法并返回结果。
function sync() {
$coroutine = new Coroutine(getArrays());
return $coroutine->wait();
}