$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,即使发送了消息,循环也会运行。
答案 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));
});
}
}