\ React \ Promise \ all($ promises)在ReactPHP中无法正常工作

时间:2018-09-24 13:05:12

标签: php promise reactphp

请注意,我还在相关的存储库上创建了issue

documentation中,它表示此函数将返回一个promise,该诺言将在数组中的所有promise都解决后解决。

这是我的实现;

private function downloadListingImages($contents)
{
    $response = [];
    $name = 1;
    foreach ($contents['images'] as $image) {
        $response[] = $this->downloadImage($image, $name);
        $name++;
    }
    return $response;
}

private function downloadImage($link, $name)
{
    $guzzle = new Client([
        'handler' => HandlerStack::create(new HttpClientAdapter($this->loop)),
    ]);

    $promise = $guzzle->getAsync($link, [
        'save_to' => 'assets/' . $name . '.jpg',
    ]);

    return $promise;
}

$promises = $this->downloadListingImages($contents);

现在,到目前为止一切都很好。但是我想做的就是从请求中获取$contents到我的服务器。所以我有一个服务器实现;

$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) use ($promises) {

    \React\Promise\all($promises)->always(function($val) {
        file_put_contents('meh.txt', "meh");
    });

    return new React\Http\Response(
        200,
        array('Content-Type' => 'text/plain'),
        "Hello World!\n"
    );

});

我在这里期望$server返回立即响应(确实如此),过了一会儿,在我的仓库中看到meh.txt。但是,它永远不会属于always回调。而且,即使我没有在all方法上链接任何函数,它也只会自行解决。它不应该等到then或类似的东西被解决吗?工作完成后,如何才能使我的口哨承诺异步并得到通知?

1 个答案:

答案 0 :(得分:0)

只要传递给\ React \ Promise \ all的对象都可以实现该方法,它就可以很好地工作。例如。 \ React \ Promise \ All与\ React \ Promise \ Promise()以及\ GuzzleHttp \ Promise \ Promise都可以很好地工作。

到目前为止,我无法重现此问题。

正如您在文档中所看到的,Always-method不接受任何参数。如果需要参数,请考虑使用而不是始终使用。 还应考虑file_put_contents可能会阻止事件循环。

我希望这会有所帮助。