---
title: "持久操作与故障恢复"
description: "区分普通调用、Task 和持久 Operation，安全恢复拍照、上传与业务写入。"
---

> Documentation Index
> Fetch the complete documentation index at: https://h5-app-docs.glass.tengyusmart.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 持久操作与故障恢复

| 类型 | 典型入口 | 如何确认完成 |
| --- | --- | --- |
| 普通调用 | `storage.get()`、`files.stat()` | 等待 Promise 返回。 |
| Task | `http.request()`、`files.download()` | 等待 `task.result`。`subscribe()` 仅提供字节进度。 |
| Operation | `camera.capture()`、`recording.start()`、`files.upload()`、`operations.enqueue()` | 等待 `operation.result()` 或读取 `operation.get()` 返回的快照。 |

## 保存意图再发起

1. 用户明确操作后，生成唯一的 `idempotencyKey`，保存键和固定请求内容。用存储修订号或提交锁防止重复发起。
2. 提交时使用原键和原内容。Host 以应用、操作类型和键识别同一意图。同键内容改变会被拒绝。
3. 收到句柄时保存 `operation.id`。收到句柄只代表可以查询该操作。界面应按已知的 `pending`、`running`、`succeeded`、`failed` 或 `cancelled` 状态呈现结果。

## 恢复原操作

重开应用时，有 ID 用 `glass.operations.get(id)`，没有 ID 用 `glass.operations.find(type, idempotencyKey)`。已知 ID 也可用 `glass.operations.open(id)` 获取句柄。快照事件可加快界面更新，恢复时仍主动查询。

调用超时、连接中断、查询为空或 `RESULT_UNKNOWN` 时，保留原意图供用户继续查询和排查。特别是 `failed` 快照携带 `RESULT_UNKNOWN` 时，仍按结果未知处理。避免换键重新拍照、上传或写入。保存失败、权限不足等已明确失败的情况，处理具体原因后由用户决定下一步。

`operation.result()` 默认轮询间隔 750 毫秒，最长等待 60 秒。取消本地等待只结束调用方等待。原生取消是否支持由返回状态决定。录像结束使用针对原操作 ID 的 `recording.stop()`，之后查询原操作确认最终文件。HTTP 写入的持久操作完成时还要检查响应状态与业务字段。

完整示例见 [拍照并恢复结果](https://h5-app-docs.glass.tengyusmart.cn/examples/capture-photo/)。

Source: https://h5-app-docs.glass.tengyusmart.cn/reference/operations/index.mdx
