await_any_of
(PHP 8.6+, True Async 1.0)
await_any_of() — Ожидает завершения первых N задач, собирая результаты и ошибки отдельно. Не выбрасывает исключение при ошибке отдельных задач.
Описание
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
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() — все задачи с допуском ошибок