await_all_or_fail

(PHP 8.6+, True Async 1.0)

await_all_or_fail() — Wartet auf den erfolgreichen Abschluss aller Aufgaben. Beim ersten Fehler wird eine Ausnahme geworfen und die verbleibenden Aufgaben werden abgebrochen.

Beschreibung

await_all_or_fail(
    iterable $triggers,
    ?Async\Awaitable $cancellation = null,
    bool $preserveKeyOrder = true
): array

Parameter

triggers Eine iterierbare Sammlung von Async\Completable-Objekten (Coroutinen, Futures usw.).

cancellation Ein optionales Awaitable zum Abbrechen des gesamten Wartens (z.B. timeout()).

preserveKeyOrder Wenn true (Standard), werden die Ergebnisse in der Schluesselreihenfolge des Eingabearrays zurueckgegeben. Wenn false, in Abschlussreihenfolge.

Rueckgabewerte

Ein Array der Ergebnisse aller Aufgaben. Die Schluessel entsprechen den Schluesseln des Eingabearrays.

Fehler/Ausnahmen

Wirft die Ausnahme der ersten fehlgeschlagenen Aufgabe.

Beispiele

Beispiel #1 Paralleles Laden von Daten

<?php
use function Async\spawn;
use function Async\await_all_or_fail;

$results = await_all_or_fail([
    'users'    => spawn(file_get_contents(...), 'https://api/users'),
    'orders'   => spawn(file_get_contents(...), 'https://api/orders'),
    'products' => spawn(file_get_contents(...), 'https://api/products'),
]);

// $results['users'], $results['orders'], $results['products']
?>

Beispiel #2 Mit Timeout

<?php
use function Async\spawn;
use function Async\await_all_or_fail;
use function Async\timeout;

try {
    $results = await_all_or_fail($coroutines, timeout(5000));
} catch (Async\TimeoutException $e) {
    echo "Nicht alle Aufgaben wurden innerhalb von 5 Sekunden abgeschlossen\n";
}
?>

Beispiel #3 Mit Iterator statt Array

Alle Funktionen der await_*-Familie akzeptieren nicht nur Arrays, sondern jedes iterable, einschliesslich Iterator-Implementierungen. Dies ermoeglicht die dynamische Erzeugung von Coroutinen:

<?php
use function Async\spawn;
use function Async\await_all_or_fail;

class UrlIterator implements \Iterator {
    private array $urls;
    private int $pos = 0;

    public function __construct(array $urls) { $this->urls = $urls; }
    public function current(): mixed {
        return spawn(file_get_contents(...), $this->urls[$this->pos]);
    }
    public function key(): int { return $this->pos; }
    public function next(): void { $this->pos++; }
    public function valid(): bool { return isset($this->urls[$this->pos]); }
    public function rewind(): void { $this->pos = 0; }
}

$iterator = new UrlIterator([
    'https://api.example.com/a',
    'https://api.example.com/b',
    'https://api.example.com/c',
]);

$results = await_all_or_fail($iterator);
?>

Siehe auch