TaskGroup::any

(PHP 8.6+, True Async 1.0)

public TaskGroup::any(): Async\Future

Повертає Future, який завершується з результатом першої успішно виконаної задачі. Задачі, що завершились з помилкою, пропускаються. Решта задач продовжують виконання.

Якщо всі задачі завершились з помилками, Future відхиляється з CompositeException.

Повернений Future підтримує токен скасування через await(?Completable $cancellation).

Значення, що повертається

Async\Future — майбутній результат першої успішної задачі. Викличте ->await(), щоб отримати значення.

Помилки

Приклади

Приклад #1 Перша успішна

<?php

use Async\TaskGroup;

spawn(function() {
    $group = new TaskGroup();

    $group->spawn(fn() => throw new \RuntimeException("fail 1"));
    $group->spawn(fn() => throw new \RuntimeException("fail 2"));
    $group->spawn(fn() => "success!");

    $result = $group->any()->await();
    echo $result . "\n"; // "success!"

    // Помилки невдалих задач потрібно явно придушити
    $group->suppressErrors();
});

Приклад #2 Усі невдалі

<?php

use Async\TaskGroup;

spawn(function() {
    $group = new TaskGroup();

    $group->spawn(fn() => throw new \RuntimeException("err 1"));
    $group->spawn(fn() => throw new \RuntimeException("err 2"));

    $group->seal();

    try {
        $group->any()->await();
    } catch (\Async\CompositeException $e) {
        echo count($e->getExceptions()) . " errors\n"; // "2 errors"
    }
});

Приклад #3 Стійкий пошук з тайм-аутом

<?php

use Async\TaskGroup;

spawn(function() {
    $group = new TaskGroup();

    $group->spawn(fn() => searchGoogle($query));
    $group->spawn(fn() => searchBing($query));
    $group->spawn(fn() => searchDuckDuckGo($query));

    $timeout = Async\timeout(3.0);

    try {
        $result = $group->any()->await($timeout);
    } catch (Async\TimeoutException) {
        echo "Жоден провайдер не відповів за 3 секунди\n";
    }

    $group->suppressErrors();
});

Дивіться також