Skip to content

Instantly share code, notes, and snippets.

@jefersondaniel
Last active February 6, 2018 23:42
Show Gist options
  • Save jefersondaniel/ff59c27d4267610178480f718aec3909 to your computer and use it in GitHub Desktop.
Save jefersondaniel/ff59c27d4267610178480f718aec3909 to your computer and use it in GitHub Desktop.
Exemplo de código assíncrono com Amp
<?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