TaskSet::joinAny

(PHP 8.6+, True Async 1.0)

public TaskSet::joinAny(): Async\Future

Gibt ein Future zurück, das mit dem Ergebnis des ersten erfolgreich abgeschlossenen Tasks aufgelöst wird. Tasks, die mit einem Fehler abgeschlossen wurden, werden übersprungen.

Nach der Auslieferung des Ergebnisses wird der Eintrag automatisch aus dem Set entfernt.

Die verbleibenden Tasks laufen weiter.

Wenn alle Tasks mit Fehlern abgeschlossen wurden, wird das Future mit CompositeException abgelehnt.

Das zurückgegebene Future unterstützt ein Cancellation-Token über await(?Completable $cancellation).

Rückgabewert

Async\Future — ein zukünftiges Ergebnis des ersten erfolgreichen Tasks. Rufen Sie ->await() auf, um den Wert zu erhalten.

Fehler

Beispiele

Beispiel #1 Erstes erfolgreiches Ergebnis

<?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 (fehlgeschlagene Tasks verbleiben)
});

Beispiel #2 Alle Tasks fehlgeschlagen

<?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()) . " Fehler\n"; // "2 Fehler"
    }
});

Beispiel #3 Fehlertolerante Suche

<?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 "Gefunden, aktiv: {$set->count()}\n";
});

Siehe auch