2015-01-29 6 views
2

Я пытаюсь использовать бассейн Гузл в приложении Symfony 2. Я думаю использовать его, потому что его способность отправлять одновременный запрос сразу.Guzzle Pool in Symfony 2 - Работа с будущим

Однако, поскольку его асинхронный характер, я не уверен, как использовать его в качестве службы в Symfony 2. Так как возврат не всегда возможен.

Например, скажем, у меня есть служба под названием Foo в Symfony, у которой есть метод, подобный этому, какой-то.

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 

Есть ли способ обойти эту проблему. Я действительно хочу использовать Future, так как мне нужна функция async.

+0

Есть ли '$ response' метод' getBody() '? Пробовали ли вы 'var_dump()' ваш '$ response'? – chapay

+0

Да, я пробовал это, но это не принесло бы пользы. Так как к тому времени ответ не готов. – nicholasnet

+0

Я имел в виду 'var_dump()' он как раз перед 'return '\ n". $ Response-> getBody(); ' – chapay

ответ

0

Вы должны иметь дело с обещаниями (фьючерсами) в своем приложении или ждать результатов.

О вашем примере: во-первых, вы ничего не возвращаете от 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. 

Я слегка изменил вам код жрать 6 (текущую версию Guzzle, который должен использоваться в новых проектах).

BTW, Guzzle использует its own implementation of promises, что не связано с реакцией.