狂饮异步多承诺(Guzzle Async Multiple Promises)

2019-10-28 17:01发布

所以我想用狂饮一对夫妇的并发请求。 我在网上看到一些例子,这就是我想出了,但似乎无法得到它的工作。 没有错误,没有警告,什么都没有。 我试图记录每一个承诺内,但没有任何反应。

我知道肯定什么也没有发生,因为没有在DB得到插入。 任何想法,我缺少什么? (我得到与其相应的每一个请求then ,因为在每一个承诺结束时,DB操作是特定于该用户)

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();

Answer 1:

不知道西隧你没有得到一个错误,但你的发电机肯定是不对的。

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 Async Multiple Promises