Я пытаюсь использовать жадные обещания чтобы сделать несколько http-вызовов, чтобы проиллюстрировать, что у меня есть, я привел этот простой пример, где поддельный http-запрос занял бы 5 секунд:
$then = microtime(true);
$promise = new Promise(
function() use (&$promise) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise->resolve($httpResponse);
});
$promise2 = new Promise(
function() use (&$promise2) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise2->resolve($httpResponse);
});
echo 'PROMISE_1 ' . $promise->wait();
echo 'PROMISE_2 ' . $promise2->wait();
echo 'Took: ' . (microtime(true) - $then);
Теперь я хотел бы запустить их обоих, а затем заставить оба эха ждать ответа. На самом деле происходит пожар обещания 1, ожидание 5 секунд, затем обещание огня 2 и ожидание еще 5 секунд.
Насколько я понимаю, я должен использовать ->resolve();
функция обещания, чтобы это началось, но я не знаю, как передать разрешение функции, в которой я бы сделал HTTP-вызов
Используя wait()
вы заставляете обещание быть выполненным синхронно: https://github.com/guzzle/promises#synchronous-wait
Согласно ЧаВо ты должен использовать requestAsync()
с вашими RESTful звонками:
Может ли Guzzle отправлять асинхронные запросы?
Да. Вы можете использовать requestAsync, sendAsync, getAsync, headAsync,
методы putAsync, postAsync, deleteAsync и patchAsync клиента
отправить асинхронный запрос. Клиент вернет
GuzzleHttp \ Promise \ PromiseInterface объект. Вы можете тогда
функционирует вне обещания.$promise = $client->requestAsync('GET', 'http://httpbin.org/get'); $promise->then(function ($response) { echo 'Got a response! ' . $response->getStatusCode(); });
Вы можете принудительно завершить асинхронный ответ, используя wait ()
метод возвращенного обещания.$promise = $client->requestAsync('GET', 'http://httpbin.org/get'); $response = $promise->wait();
Этот вопрос немного старый, но я не вижу ответа, поэтому я попробую, может быть, кто-то найдет его полезным.
Вы можете использовать функцию all($promises)
,
Я не могу найти документацию по этой функции, но вы можете найти ее реализацию Вот.
Комментарий над этой функцией начинается так:
Получив массив обещаний, верните обещание, которое выполняется, когда все элементы в массиве выполнены.
Похоже, что вы ищете, так что вы можете сделать что-то вроде этого:
$then = microtime(true);
$promises = [];
$promises[] = new Promise(
function() use (&$promise) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise->resolve($httpResponse);
});
$promises[] = new Promise(
function() use (&$promise2) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise2->resolve($httpResponse);
});
all($promises)->wait();
echo 'Took: ' . (microtime(true) - $then);
Если эта функция не помогает решить вашу проблему, в этом файле есть и другие интересные функции, такие как some($count, $promises)
, any($promises)
или же settle($promises)
,