Жрать асинхронные несколько обещаний - PullRequest
0 голосов
/ 27 апреля 2019

Так что я пытаюсь использовать жрет для пары одновременных запросов.Я видел несколько примеров в Интернете, и это то, что я придумал, но не могу заставить его работать.Нет ошибок, нет предупреждений, ничего.Я пытался войти в каждое обещание, но ничего не происходит.

И я точно знаю, что ничего не происходит, потому что ничего не вставляется в БД.Есть идеи, что мне не хватает?(Я выдаю каждый запрос с соответствующим then, потому что в конце каждого обещания операции с БД определяются для этого пользователя)

use GuzzleHttp\Promise\EachPromise;
use Psr\Http\Message\ResponseInterface;

$promises = (function () use($userUrls){
    $userUrls->each(function($user) {
        yield $this->client->requestAsync('GET', $user->pivot->url)
            ->then(function (ResponseInterface $response) use ($user) {
                $this->dom->load((string)$response->getBody());
                // ... some db stuff that inserts row in table for this
                // $user with stuff from this request
            });
    });
});

$all = new EachPromise($promises, [
    'concurrency' => 4,
    'fulfilled' => function () {

    },
]);

$all->promise()->wait();

1 Ответ

1 голос
/ 29 апреля 2019

Не уверен, что вы не получите ошибку, но ваш генератор определенно не так.

use Psr\Http\Message\ResponseInterface;
use function GuzzleHttp\Promise\each_limit_all;

$promises = function () use ($userUrls) {
    foreach ($userUrls as $user) {
        yield $this->client->getAsync($user->pivot->url)
            ->then(function (ResponseInterface $response) use ($user) {
                $this->dom->load((string)$response->getBody());
                // ... some db stuff that inserts row in table for this
                // $user with stuff from this request
            });
    };
};

$all = each_limit_all($promises(), 4);

$all->promise()->wait();

Примечание foreach вместо $userUrls->each(), это важно, потому что в вашей версии генераторной функции является функция, которая передается вызову ->each(), а не та, которую вы назначаете $promise.

Также обратите внимание, что вы должны активировать генератор (вызовите $promises(), чтобы передать результат, а не передавать саму функцию в Guzzle).

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

...