停止foreach循环的麻烦取决于承诺解决或拒绝

时间:2018-06-13 12:48:20

标签: php asynchronous promise reactphp

$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,
$ channels是一个包含3个相同对象实例的数组(具有不同的值)
当我点击send()时,它返回一个ExtendedPromiseInterface,其中$ resolve在发送消息时执行,$ reject在未发送时执行。

所以我想做的是检查邮件是否已发送,如果没有,则继续循环并尝试将邮件发送到另一个频道,如果发送则打破循环。

但是意外的是它总是返回false,即使发送了消息,循环也会运行。

1 个答案:

答案 0 :(得分:0)

嘿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));
        });
    }
}