Перейти к основному содержанию

FuncTask

FuncTask выполняет любую функцию, пока очередь показывает статус «в работе». Задача полезна для операций без пользовательского ввода: загрузка данных, проверка подключений, подготовка окружения.

Создание

task := ziva.NewFuncTask("Сборка", func() error {
    return buildArtifacts()
})
Функция должна возвращать error. Любая ошибка отображается в интерфейсе и может остановить очередь.

Опции конфигурации

WithStopOnError

task := ziva.NewFuncTask("Развертывание", deploy,
    ziva.WithStopOnError(true),
)
Если функция вернёт ошибку, очередь остановится и Run() завершится с этой ошибкой.

WithSummaryFunction

var stats struct {
    Duration time.Duration
    Hosts    int
}

task := ziva.NewFuncTask("Проверка кластера", func() error {
    start := time.Now()
    hosts, err := pingAll()
    stats.Duration = time.Since(start)
    stats.Hosts = hosts
    return err
}, ziva.WithSummaryFunction(func() []string {
    return []string{
        fmt.Sprintf("Время: %s", stats.Duration),
        fmt.Sprintf("Узлов доступно: %d", stats.Hosts),
    }
}))
Сводка выводится сразу под заголовком задачи после успешного выполнения.

Комбинирование с другими задачами

confirm := ziva.NewYesNoTask("Подтверждение", "Запустить развёртывание?")
deploy := ziva.NewFuncTask("Развёртывание", runDeployment, ziva.WithStopOnError(true))
verify := ziva.NewFuncTask("Проверка", verifySetup)

queue := ziva.NewQueue("CI/CD")
queue.AddTasks(confirm, deploy, verify)
_ = queue.Run()
Если пользователь выберет «Нет», FuncTask всё равно выполнится, но будет помечен как отклонённый (см. YesNoTask).

Рекомендации

  • Не блокируйте рендеринг. Если функция выполняется долго и может предоставить прогресс, обновляйте состояние через внешние каналы либо используйте несколько последовательных FuncTask.
  • Комбинируйте с таймерами. Для долгих операций добавьте time.Sleep или прогресс-бары внутри функции, если это оправдано.
  • Не выводите в stdout. Пусть очередь управляет экраном. Для логирования используйте файлы или отдельный канал вывода.
  • Используйте горутины осторожно. FuncTask вызывается внутри основного цикла. Если запускаете горутину, синхронизируйте её завершение внутри функции, иначе очередь перейдёт к следующей задаче преждевременно.

Связанные материалы

  • Queue — управление последовательностью задач
  • YesNoTask — удобно запускать FuncTask по подтверждению
I