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]

Примеры

Пример #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.

См. также