TaskGroup::any
(PHP 8.6+, True Async 1.0)
public TaskGroup::any(): Async\Future
Gibt ein Future zurueck, das mit dem Ergebnis der ersten erfolgreich abgeschlossenen Aufgabe aufgeloest wird.
Aufgaben, die mit einem Fehler fehlgeschlagen sind, werden uebersprungen.
Die verbleibenden Aufgaben laufen weiter.
Wenn alle Aufgaben mit Fehlern fehlschlagen, wird das Future mit CompositeException abgelehnt.
Das zurueckgegebene Future unterstuetzt ein Abbruch-Token ueber await(?Completable $cancellation).
Rueckgabewert
Async\Future — ein zukuenftiges Ergebnis der ersten erfolgreichen Aufgabe.
Rufen Sie ->await() auf, um den Wert zu erhalten.
Fehler
- Wirft
Async\AsyncException, wenn die Gruppe leer ist. - Das
Futurewird mitAsync\CompositeExceptionabgelehnt, wenn alle Aufgaben mit Fehlern fehlschlagen.
Beispiele
Beispiel #1 Erste erfolgreiche
<?php
use Async\TaskGroup;
spawn(function() {
$group = new TaskGroup();
$group->spawn(fn() => throw new \RuntimeException("Fehler 1"));
$group->spawn(fn() => throw new \RuntimeException("Fehler 2"));
$group->spawn(fn() => "Erfolg!");
$result = $group->any()->await();
echo $result . "\n"; // "Erfolg!"
// Fehler fehlgeschlagener Aufgaben muessen explizit unterdrueckt werden
$group->suppressErrors();
});
Beispiel #2 Alle fehlgeschlagen
<?php
use Async\TaskGroup;
spawn(function() {
$group = new TaskGroup();
$group->spawn(fn() => throw new \RuntimeException("Fehler 1"));
$group->spawn(fn() => throw new \RuntimeException("Fehler 2"));
$group->seal();
try {
$group->any()->await();
} catch (\Async\CompositeException $e) {
echo count($e->getExceptions()) . " Fehler\n"; // "2 Fehler"
}
});
Beispiel #3 Resiliente Suche mit Timeout
<?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 "Kein Anbieter hat innerhalb von 3 Sekunden geantwortet\n";
}
$group->suppressErrors();
});
Siehe auch
- TaskGroup::race — Erste abgeschlossene (Erfolg oder Fehler)
- TaskGroup::all — Alle Ergebnisse