Symfony 2中的Guzzle Pool - 应对未来



我正在尝试在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 无关。

最新更新