GuzzleHttp Исключение асинхронного запроса

Я не могу понять, как я могу бросить исключение из Guzzle future response обработчик.
Вот мой код:

<?php
require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client();

$req = $client->createRequest('GET', 'http://www.google.com', array(
'future' => true,
));
echo "Sending request\n";
$response = $client->send($req);

try {
$response->then(function ($data) {
echo "Response is received\n";
throw new Exception('Test');
})->then(function () {
// success handler
}, function (Exception $exception) {
echo "Error handler invoked\n";
throw $exception;
});
} catch (Exception $e) {
echo "Exception catched\n";
}
echo "Finish\n";

catch блок никогда не достигается в этом случае.

5

Решение

Вы работаете с обещаниями при использовании асинхронных запросов Guzzle. С использованием then() функция от FutureResponse создаст обещание, которое будет выполнено или отклонено по завершении запроса. Если во время отправки возникает ошибка, обещание отклоняется, что означает второй обратный вызов, предоставленный then функция вызывается. Когда запрос завершается успешно, он разрешается, и первый обратный вызов предоставляется then функция вызывается. Когда исключение генерируется в любой из функций обещания, оно попадает в обещание и пересылается следующему обработчику ошибок в цепочке. В вашем примере, если запрос завершится успешно, вы выдадите исключение, которое вызовет обратный вызов ошибки. Создание исключения в обратном вызове с ошибкой либо переадресует исключение на следующий обратный вызов с ошибкой в ​​цепочке обещаний, либо автоматически использует ошибку (в вашем случае дальнейшие обратные вызовы с ошибками не инициируются).

Библиотека React Promises, используемая Guzzle, содержит больше документации по разрешению и отклонению пересылок обещаний: https://github.com/reactphp/promise#how-promise-forwarding-works. Автор этой библиотеки изучает возможность добавления done() функция, которая может быть использована в качестве обработчика терминальных обещаний, которая фактически генерирует необработанные исключения.

7

Другие решения

Асинхронный означает, что ваш сценарий не будет ожидать ответа от сервера, а просто отправит запрос и продолжит выполнение. В этом случае срок действия сценария заканчивается до возврата ответа, поэтому ни один из обратных вызовов не выполняется.

Добавьте эту строку после перехвата, чтобы заблокировать выполнение скрипта, пока ответ не вернется.

$response->getStatusCode();

Если вы предоставите больше информации о том, чего вы хотите достичь, мы можем помочь вам в дальнейшем.

0

По вопросам рекламы [email protected]