Как ждать обещание завершить в другом классе - PullRequest
1 голос
/ 10 февраля 2020

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

class PromiseController
{
  private function load()
  {
    $client = new \GuzzleHttp\Client();

    // variables omitted for example
    $promise = $client->requestAsync('POST', $url, $options);
    $json = null;
    $promise->then(
        function (ResponseInterface $res) {
            $xml = simplexml_load_string($res->getBody(),'SimpleXMLElement',LIBXML_NOCDATA);
            $json = json_encode($xml);
            $json = $json;
            // I see my json here. Great.
        },
        function (RequestException $e) {
            Log::info($e->getMessage());
            echo $e->getMessage() . "\n";
            echo $e->getRequest()->getMethod();
        }
    );

    $return $json;
  }
}

Контроллер, где нужны данные:


// Leaving out the function etc

$data = ( new PromiseController )->load();

return array(

  'xmlAsJson' => $data

);

Возвращенные данные всегда null. Мне нужно дождаться данных в "нужном" контроллере, но как? Я хочу иметь отдельный контроллер для обработки xml до json перед передачей результата в array.

1 Ответ

1 голос
/ 11 февраля 2020

Если вы хотите распространять асинхронное c, вам нужно продолжить с обещаниями, поэтому верните новое обещание от вашего контроллера:

class PromiseController
{
    private function load()
    {
        $client = new \GuzzleHttp\Client();

        $promise = $client->requestAsync('POST', $url, $options);
        $jsonPromise = $promise->then(
            function (ResponseInterface $res) {
                $xml = simplexml_load_string($res->getBody(),'SimpleXMLElement',LIBXML_NOCDATA);
                $json = json_encode($xml);

                return $json;
            },
            function (RequestException $e) {
                Log::info($e->getMessage());
                echo $e->getMessage() . "\n";
                echo $e->getRequest()->getMethod();
            }
        );

        return $jsonPromise;
  }
}

и вызовите ->wait() для полученного обещания в коде позже:

$data = ( new PromiseController )->load()->wait();

return array(
    'xmlAsJson' => $data
);
...