Last active
February 6, 2018 23:42
-
-
Save jefersondaniel/ff59c27d4267610178480f718aec3909 to your computer and use it in GitHub Desktop.
Exemplo de código assíncrono com Amp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require __DIR__ . '/vendor/autoload.php'; | |
use Amp\Loop; | |
use Amp\Artax\Request; | |
use Amp\Artax\DefaultClient; | |
/** | |
* Faz uma requisição assíncrona em alguma das APIs que integramos | |
* | |
* @param string $url URL alvo da requisição HTTP | |
* @param string $listKey Chave do objeto retornado que contém os itens | |
* @param string $jokeKey Chave dos itens que contém a piada | |
* @return Amp\Promise Representa o resultado da operação assíncrona | |
*/ | |
function requestApi($url, $listKey, $jokeKey) { | |
// A função Amp\call converte um generator em uma promise, dentro dela e da Loop::run | |
// as instruções yield esperam pela resposta de uma promise. Durante essa espera o | |
// loop de eventos vai estar trabalhando em outros códigos, assim evitando | |
// o bloqueio do processo | |
return Amp\call(function () use ($url, $listKey, $jokeKey) { | |
$client = new DefaultClient; | |
$request = (new Request($url))->withHeader('Accept', 'application/json'); | |
$response = yield $client->request($request); // Até aqui o objeto contém apenas os headers HTTP | |
$json = json_decode(yield $response->getBody(), true); | |
return array_column($json[$listKey], $jokeKey); | |
}); | |
} | |
/** | |
* A função Loop:run gerencia o código assíncrono e permite que yield seja usado para aguardar | |
* o retorno das operações | |
*/ | |
Loop::run(function () { | |
// Enviar um array para o yield faz com que as requisições sejam feitas simultaneamente! | |
$jokeResults = yield [ | |
'dad' => requestApi('https://icanhazdadjoke.com/search?term=food', 'results', 'joke'), | |
'chuckNorris' => requestApi('https://api.chucknorris.io/jokes/search?query=food', 'result', 'value'), | |
]; | |
// Por causa do "yield" o array joke results vai conter o resultado das requisições, que são | |
// algumas piadas aleatórias. | |
foreach (array_merge($jokeResults['dad'], $jokeResults['chuckNorris']) as $joke) { | |
echo "$joke\n"; | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment