await_any_of
(PHP 8.6+, True Async 1.0)
await_any_of() — Ожидает завершения первых N задач, собирая результаты и ошибки отдельно. Не выбрасывает исключение при ошибке отдельных задач.
Описание
php
await_any_of(
int $count,
iterable $triggers,
?Async\Awaitable $cancellation = null,
bool $preserveKeyOrder = true,
bool $fillNull = false
): arrayПараметры
count Количество успешных результатов, которое нужно дождаться.
triggers Iterable коллекция объектов Async\Completable.
cancellation Опциональный Awaitable для отмены ожидания.
preserveKeyOrder Если true, ключи результатов соответствуют ключам входного массива.
fillNull Если true, для задач с ошибкой в массив результатов подставляется null.
Возвращаемое значение
Массив из двух элементов: [$results, $errors]
$results— массив успешных результатов (до$countштук)$errors— массив исключений от задач, завершившихся с ошибкой
Примеры
Пример #1 Кворум с допуском ошибок
php
<?php
use function Async\spawn;
use function Async\await_any_of;
$nodes = ['node1', 'node2', 'node3', 'node4', 'node5'];
$coroutines = [];
foreach ($nodes as $node) {
$coroutines[$node] = spawn(file_get_contents(...), "https://$node/vote");
}
// Ждём кворум: 3 из 5 ответов
[$results, $errors] = await_any_of(3, $coroutines);
if (count($results) >= 3) {
echo "Кворум достигнут\n";
} else {
echo "Кворум не достигнут, ошибок: " . count($errors) . "\n";
}
?>Примечания
Примечание: Параметр
triggersпринимает любыеiterable, включая реализацииIterator. См. пример с Iterator.
См. также
- await_any_of_or_fail() — первые N, ошибка прерывает
- await_all() — все задачи с допуском ошибок