TaskSet::joinNext

(PHP 8.6+, True Async 1.0)

public TaskSet::joinNext(): Async\Future

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

После доставки результата запись автоматически удаляется из набора, и count() уменьшается на 1.

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

Если уже есть завершённая задача — Future разрешается немедленно.

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

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

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

Ошибки

Примеры

Пример #1 Последовательная обработка результатов

<?php

use Async\TaskSet;

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

    $set->spawn(fn() => fetchUser(1));
    $set->spawn(fn() => fetchUser(2));
    $set->spawn(fn() => fetchUser(3));

    echo "до: count=" . $set->count() . "\n"; // 3

    $first = $set->joinNext()->await();
    echo "после первого: count=" . $set->count() . "\n"; // 2

    $second = $set->joinNext()->await();
    echo "после второго: count=" . $set->count() . "\n"; // 1
});

Пример #2 Цикл обработки

<?php

use Async\TaskSet;

spawn(function() {
    $set = new TaskSet(concurrency: 5);

    foreach ($urls as $url) {
        $set->spawn(fn() => httpClient()->get($url)->getBody());
    }
    $set->seal();

    while ($set->count() > 0) {
        try {
            $body = $set->joinNext()->await();
            processResponse($body);
        } catch (\Throwable $e) {
            log("Ошибка: {$e->getMessage()}");
        }
    }
});

Пример #3 С таймаутом

<?php

use Async\TaskSet;

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

    $set->spawn(fn() => slowApi()->fetchReport());
    $set->spawn(fn() => anotherApi()->fetchStats());

    try {
        $result = $set->joinNext()->await(Async\timeout(5.0));
    } catch (Async\TimeoutException) {
        echo "Ни одна задача не завершилась за 5 секунд\n";
    }
});

См. также