# 任務依賴

本頁說明任務如何等待前置任務，以及前置任務失敗時的處理方式。

## 宣告前置任務

```go
prepareID, err := c.Add("@every 1m", prepare, "prepare")
if err != nil {
	log.Fatal(err)
}

_, err = c.Add("@every 1m", process, "process", []core.Wait{
	{ID: prepareID, State: core.Skip},
})
if err != nil {
	log.Fatal(err)
}
```

依賴任務的 action 必須為 `func() error`；`func()` 搭配前置任務時 `Add` 會回傳錯誤。

## 判斷規則

有依賴的任務觸發時送入 Wait 佇列，由 Worker 每 1ms 檢查一次前置任務狀態：

| 前置任務狀態 | `State: core.Stop` | `State: core.Skip` |
|---|---|---|
| `TaskCompleted` | 視為滿足 | 視為滿足 |
| `TaskFailed` | 依賴任務標記為 `TaskFailed` | 忽略此前置任務 |
| `TaskPending`／`TaskRunning` | 繼續等待 | 繼續等待 |
| ID 不存在 | 依賴任務標記為 `TaskFailed` | 依賴任務標記為 `TaskFailed` |

- 等待時限固定為 1 分鐘，`Wait.Delay` 目前未生效
- 判斷依據前置任務的「目前狀態」，不要求在同一輪觸發中完成
- 以 `func()` 註冊的前置任務自加入起即為 `TaskCompleted`
- 依賴任務本身狀態為 `TaskRunning` 或 `TaskCompleted` 時，觸發會直接略過、不檢查前置任務，因此成功執行一次後不會再執行；狀態為 `TaskFailed` 時會在下一次觸發重新判斷

`Wait` 與 `WaitState` 型別見 [依賴 API](/zh/api-reference-dependencies)。
