Проблемы с остановкой цикла foreach зависят от решения или отклонения обещаний - PullRequest
0 голосов
/ 13 июня 2018
$msg_sent = false;
foreach ($channels as $channel) {
    $resolve = function() use ( &$msg_sent )
    {
        $msg_sent = true;
    };
    $reject = function( \Exception $e )
    {
        error_log( $e, 3, './error.txt' . PHP_EOL );
    };
    $channel->send('hlw')->done( $resolve, $reject );
    if ( $msg_sent ){
        break;
    } else {
        continue;
    }
}

Как вы можете видеть выше,
$ msg_sent - false,
$ channel - это массив с 3 экземплярами одинаковых объектов (с разными значениями)
, и когда я нажимаю send (),он возвращает ExtendedPromiseInterface, в котором $ resolved выполняется при отправке сообщения и $ reject, когда не отправляется.

Итак, я хочу проверить, отправлено сообщение или нет, если нет, то продолжите цикли попробуйте отправить сообщение на другой канал, если оно отправлено, затем прервите цикл.

Но неожиданно оно всегда возвращает false, и цикл запускается, даже если сообщение отправлено.

1 Ответ

0 голосов
/ 13 июня 2018

Привет, член команды ReactPHP здесь.Этот цикл foreach будет просто отправлять все в одно и то же время.Вы можете сделать что-то вроде этого, чтобы отправить запрос только после того, как вы получите предыдущий с этим (псевдокод), который разрешается с true в случае успеха и false при всех сбоях вызовов:

final class Bier
{
    public function check($channels): PromiseInterface
    {
        $channel = array_shift($channels);
        return $channel->send('hlw')->then(function () {
            return resolve(true);
        }, function () use ($channels) {
            if (count($channels) === 0) {
                return resolve(false);
            }
            return resolve($this->check($channels));
        });
    }
}
...