|
|
Promise 是 ArkTS 中处理异步操作的核心机制,在 index.ets 文件中出现 Promise 通常用于处理网络请求、文件操作等异步场景。以下是关键点详解:
**一、核心概念**
1. **异步容器**
Promise 是承载异步操作的容器对象,通过 resolve(成功)/reject(失败) 控制状态流转<rsup>1</rsup>。典型结构示例:
```typescript
interface ResponseData {
code: number;
data?: string; // 可选字段
}
const asyncTask = (): Promise<ResponseData> => {
return new Promise((resolve, reject) => {
// 模拟异步操作
setTimeout(() => {
Math.random() > 0.5
? resolve({ code: 200, data: "成功" })
: reject({ code: 500 });
}, 1000);
});
};
```
2. **状态机制**
- Pending:初始状态(异步未完成)
- Fulfilled:操作成功(通过 then 接收结果)
- Rejected:操作失败(通过 catch 捕获错误)<rsup>1</rsup>
**二、典型应用场景**
1. **链式调用**
解决嵌套回调问题(回调地狱):
```typescript
getUserId()
.then(uid => getOrder(uid)) // 前一步结果作为参数
.then(order => showOrder(order))
.catch(err => console.error(err)); // 统一错误处理
```
2. **async/await 同步化**
使异步代码具备同步风格:
```typescript
const loadData = async () => {
try {
const uid = await getUserId();
const order = await getOrder(uid);
return order;
} catch (e) {
console.error("加载失败", e);
}
};
```
**三、常见问题处理**
1. **并行执行**
无依赖异步任务使用 `Promise.all` 加速:
```typescript
const [user, goods] = await Promise.all([
fetchUser(),
fetchGoodsList()
]);
```
2. **部分容错场景**
需保留所有异步结果时使用 `Promise.allSettled`:
```typescript
const results = await Promise.allSettled([task1(), task2()]);
results.forEach(res => {
if (res.status === "fulfilled") {
// 处理成功结果
} else {
// 处理失败原因
}
});
```
**四、注意事项**
- **错误处理必须性**:未捕获的 Promise 错误会导致应用崩溃
- **async 函数返回值**:async 函数必定返回 Promise,需通过 then 或 await 获取结果<rsup>1</rsup>
- **类型约束**:ArkTS 强类型特性要求明确指定 Promise 泛型类型(如 `Promise<string>`)
若具体行号中存在 `then().catch()` 链式调用或 `await` 表达式,则表示该处正在进行异步状态处理。需要结合具体代码上下文判断是数据加载、状态更新还是其他异步交互场景。
|
|