Возврат синхронно, когда Реакция / Обещание разрешены

Мне нужно вернуться из вызова функции после того, как React/Promise была решена. Основная идея состоит в том, чтобы подделать синхронный вызов от асинхронного. Это означает, что внешняя функция должна возвращать значение после того, как обещание было разрешено или отклонено.

Это для создания драйвера для RedBeanPHP с использованием React/Mysql. Я знаю, что это, вероятно, приведет к нехватке процессора в цикле событий React.

Моя первоначальная идея заключалась в том, чтобы использовать генератор, а затем вызвать yield внутри \React\Promise\Deferred::then Перезвоните.

function synchronous()
{
    $result = asynchronous();
}

function asynchronous()
{
    $deferred = new \React\Promise\Deferred;

    $sleep = function() use ($deferred)
    {
        sleep(5);
        $deferred->resolve(true);
    };

    $deferred->then(function($ret) {
        yield $ret;
    });

    $sleep();
}

Класс генератора PHP, AFAICT, может быть непосредственно создан только самим движком PHP. Обратный вызов then должен был бы напрямую вызвать send на генераторе асинхронной функции, чтобы это работало.

2 ответа

В PHP отсутствуют оба продолжения, а также делегирование генератора, что позволило бы вызывать yield из вложенного обратного вызова, что на данный момент делает это совершенно невозможным.

ReactPhp предлагает пакет асинхронных инструментов, который имеетawaitфункция. Затем код может стать:

      function synchronous()
{
    $result = \React\Async\await(asynchronous());
}

function asynchronous()
{
    $deferred = new \React\Promise\Deferred;

    $sleep = function() use ($deferred)
    {
        sleep(5);
        $deferred->resolve(true);
    };

    $sleep();

    return $deferred->promise();
}

Другие вопросы по тегам