Coroutine::finally
(PHP 8.6+, True Async 1.0)
public Coroutine::finally(\Closure $callback): void
Регистрирует callback-функцию, которая будет вызвана при завершении корутины, независимо от результата (успех, ошибка или отмена).
Если корутина уже завершилась на момент вызова finally(), callback выполнится немедленно.
Можно зарегистрировать несколько обработчиков — они выполняются в порядке добавления.
Параметры
- callback
- Функция-обработчик. Получает объект корутины в качестве аргумента.
Примеры
Пример #1 Базовое использование
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
return "test result";
});
$coroutine->finally(function() {
echo "Корутина завершилась\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 "Соединение закрыто\n";
});
$result = await($coroutine);
Пример #3 Несколько обработчиков
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(fn() => "done");
$coroutine->finally(fn() => echo "Обработчик 1\n");
$coroutine->finally(fn() => echo "Обработчик 2\n");
$coroutine->finally(fn() => echo "Обработчик 3\n");
await($coroutine);
// Вывод:
// Обработчик 1
// Обработчик 2
// Обработчик 3
Пример #4 Регистрация после завершения
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(fn() => 42);
await($coroutine);
// Корутина уже завершена — callback выполнится немедленно
$coroutine->finally(function() {
echo "Вызвано немедленно\n";
});
См. также
- Coroutine::isCompleted — Проверить завершение
- Coroutine::getResult — Получить результат