Coroutine::finally
(PHP 8.6+, True Async 1.0)
public Coroutine::finally(\Closure $callback): void
Реєструє функцію зворотного виклику, яка буде викликана після завершення корутини, незалежно від результату (успіх, помилка або скасування).
Якщо корутина вже завершилася на момент виклику finally(), зворотний виклик буде виконано негайно.
Можна зареєструвати кілька обробників – вони виконуються в порядку додавання.
Параметри
- callback
- Функція-обробник. Отримує об’єкт корутини як аргумент.
Приклади
Приклад #1 Базове використання
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
return "test result";
});
$coroutine->finally(function() {
echo "Coroutine completed\n";
});
await($coroutine);
Приклад #2 Очищення ресурсів
<?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 "Connection closed\n";
});
$result = await($coroutine);
Приклад #3 Кілька обробників
<?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);
// Output:
// Handler 1
// Handler 2
// Handler 3
Приклад #4 Реєстрація після завершення
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(fn() => 42);
await($coroutine);
// Корутина вже завершилася -- зворотний виклик виконується негайно
$coroutine->finally(function() {
echo "Called immediately\n";
});
Дивіться також
- Coroutine::isCompleted – Перевірка завершення
- Coroutine::getResult – Отримати результат