\ React \ Promise \ all ($ promises) не работает должным образом в ReactPHP - PullRequest
0 голосов
/ 24 сентября 2018

Обратите внимание, что я также создал выпуск для соответствующего репо.

В документации говорится, что эта функция будет возвращать обещание, котороебудет решен после того, как все обещания в массиве будут разрешены.

Вот моя реализация;

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 голосов
/ 27 сентября 2018

Пока объекты, переданные в \ React \ Promise \ all, реализуют метод, он работает очень хорошо.Например, \ React \ Promise \ все отлично работает с \ React \ Promise \ Promise (), а также с \ GuzzleHttp \ Promise \ Promise.

Пока что я не могу воспроизвести эту проблему.

Как видно из документации, метод always не принимает никаких параметров.Попробуйте использовать вместо всегда, если вам нужен параметр.Также учтите, что file_put_contents МОЖЕТ заблокировать цикл обработки событий.

Надеюсь, это поможет.

...