# task_race ## 功能 等待一组后台任务中最先完成的任务,并返回它的结果。`task_race(tasks)` 使用任务完成订阅唤醒,不通过 `done()` 加 `sleep()` 轮询。 ## 语法 ```bt value = task_race(tasks) ``` ## 参数 | 参数 | 类型 | 必填 | 默认值 | 说明 | | ------ | ------ | ------ | ------ | ------ | | tasks | Array<Task> | 是 | 无 | 要竞争完成结果的 Task 数组。 | ## 返回值 | 类型 | 说明 | | ------ | ------ | | 任意值 / Empty | 返回最先完成任务的结果;空数组返回 `empty`。 | 如果胜出的任务 `throw`,`task_race()` 会重新抛出;如果胜出的任务普通失败,则返回运行时错误。其他未完成任务会继续运行,不会被强制取消。 ## 示例 ```bt fast = task(fn() { return 'fast' }) slow = task(fn() { sleep(1000) return 'slow' }) value = task_race([slow, fast]) // 输出:fast print value ``` ```bt value = task_race([]) // 输出:empty print value ``` ## 注意事项 - 参数必须是数组,数组元素必须全部是 Task。 - 注册前已有任务完成时,按输入顺序返回第一个已完成任务。 - 多个任务几乎同时完成时,按完成事件进入等待通道的顺序返回;同一轮已完成扫描按输入顺序打破平局。 - 同一个 Task 在数组中出现多次时,按输入位置视为多个候选。 - `task_race()` 会阻塞当前执行流;Web 请求热路径中应谨慎使用。