TaskSet::joinAny

(PHP 8.6+, True Async 1.0)

public TaskSet::joinAny(): Async\Future

Возвращает Future, который разрешится результатом первой успешно завершившейся задачи. Задачи, завершившиеся с ошибкой, пропускаются.

После доставки результата запись автоматически удаляется из набора.

Остальные задачи продолжают работать.

Если все задачи завершились с ошибкой — Future реджектится с CompositeException.

Возвращённый Future поддерживает токен отмены через await(?Completable $cancellation).

Возвращаемое значение

Async\Future — будущий результат первой успешной задачи. Для получения значения вызовите ->await().

Ошибки

Примеры

Пример #1 Первый успешный результат

<?php

use Async\TaskSet;

spawn(function() {
    $set = new TaskSet();

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

    $result = $set->joinAny()->await();
    echo $result . "\n"; // "success!"
    echo $set->count() . "\n"; // 2 (ошибочные задачи остались)
});

Пример #2 Все задачи упали

<?php

use Async\TaskSet;

spawn(function() {
    $set = new TaskSet();

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

    $set->seal();

    try {
        $set->joinAny()->await();
    } catch (\Async\CompositeException $e) {
        echo count($e->getExceptions()) . " ошибок\n"; // "2 ошибок"
    }
});

Пример #3 Устойчивый поиск

<?php

use Async\TaskSet;

spawn(function() {
    $set = new TaskSet();

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

    $result = $set->joinAny()->await(Async\timeout(3.0));
    echo "Найдено, активных: {$set->count()}\n";
});

См. также