Coroutine::finally

(PHP 8.6+, True Async 1.0)

public Coroutine::finally(\Closure $callback): void

Registriert eine Callback-Funktion, die beim Abschluss der Coroutine aufgerufen wird, unabhaengig vom Ergebnis (Erfolg, Fehler oder Abbruch).

Wenn die Coroutine zum Zeitpunkt des finally()-Aufrufs bereits abgeschlossen ist, wird der Callback sofort ausgefuehrt.

Es koennen mehrere Handler registriert werden – sie werden in der Reihenfolge ausgefuehrt, in der sie hinzugefuegt wurden.

Parameter

callback
Die Handler-Funktion. Erhaelt das Coroutine-Objekt als Argument.

Beispiele

Beispiel #1 Grundlegende Verwendung

<?php

use function Async\spawn;
use function Async\await;

$coroutine = spawn(function() {
    return "test result";
});

$coroutine->finally(function() {
    echo "Coroutine abgeschlossen\n";
});

await($coroutine);

Beispiel #2 Ressourcenbereinigung

<?php

use function Async\spawn;
use function Async\await;

$connection = connectToDatabase();

$coroutine = spawn(function() use ($connection) {
    return $connection->query('SELECT * FROM users');
});

$coroutine->finally(function() use ($connection) {
    $connection->close();
    echo "Verbindung geschlossen\n";
});

$result = await($coroutine);

Beispiel #3 Mehrere Handler

<?php

use function Async\spawn;
use function Async\await;

$coroutine = spawn(fn() => "done");

$coroutine->finally(fn() => echo "Handler 1\n");
$coroutine->finally(fn() => echo "Handler 2\n");
$coroutine->finally(fn() => echo "Handler 3\n");

await($coroutine);
// Ausgabe:
// Handler 1
// Handler 2
// Handler 3

Beispiel #4 Registrierung nach Abschluss

<?php

use function Async\spawn;
use function Async\await;

$coroutine = spawn(fn() => 42);
await($coroutine);

// Coroutine bereits abgeschlossen -- Callback wird sofort ausgefuehrt
$coroutine->finally(function() {
    echo "Sofort aufgerufen\n";
});

Siehe auch