我正在尝试在Symfony 2应用程序中使用Guzzle池。我正在考虑使用它,因为它能够一次发送并发请求。
但是,由于它本质上是异步的,我不确定如何在Symfony 2中将其用作服务。因为回报并不总是立竿见影的。
例如,假设我在Symfony中有一个名为Foo的服务,它有这样的方法。
function test()
{
$request = $client->createRequest('GET', 'http://lt/?n=0', ['future' => true]);
$client->send($request)->then(function ($response) {
return "n".$response->getBody();
});
}
现在我像这样调用此服务。
$service = $this->get('foo');
$result = $service->test();
echo $result;// does not work :( echoes out null
有没有办法解决这个问题。我真的很想使用未来,因为我需要异步功能。
应用程序中处理承诺(期货)或等待结果。
关于您的示例:首先,您不会从test()
;)返回任何内容正因为如此,你不会得到任何$result
.正如我之前所说,你必须在这里选择两种不同的方式:1)在方法中等待HTTP调用并返回结果本身test()
或者2)立即返回Promise并在你的应用程序中处理它(通过then()
,最后otherwise()
和wait()
)。
如果为整个应用选择异步方式,则代码可能如下所示:
function test()
{
return $client->getAsync('http://lt/?n=0')
->then(function ($response) {
return "n".$response->getBody();
});
}
后来:
$service = $this->get('foo');
$promise = $service->test()->then(function ($responseString) {
echo $responseString;
});
$promise->wait(); // Here you get the output.
我稍微改变了Guzzle 6的代码(当前版本的Guzzle,应该在新项目中使用)。
顺便说一句,Guzzle 使用自己的承诺实现,这与 React 无关。