Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 79|回复: 1

Promise 详解

[复制链接]

480

主题

660

帖子

3881

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3881
发表于 2026-2-27 17:50:50 | 显示全部楼层 |阅读模式
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` 表达式,则表示该处正在进行异步状态处理。需要结合具体代码上下文判断是数据加载、状态更新还是其他异步交互场景。

回复

使用道具 举报

480

主题

660

帖子

3881

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3881
 楼主| 发表于 2026-2-28 19:05:49 | 显示全部楼层
interface ResponseData {
  code: number;
  data?: string; // 可选字段
}

// Promise 本身是一个构造函数(函数对象),是异步操作的容器
//  函数= 参数:返回值 =>函数体
const asyncTask = (): Promise<ResponseData> => {
  // 返回一个Promise容器,=> 容器体
  return new Promise((resolve, reject) => {
    // 模拟异步操作
    // setTimeout( 函数(参数() => 函数体), 参数(1000))
    setTimeout(() => {
      Math.random() > 0.5
        ? resolve({ code: 200, data: "成功" })
        : reject({ code: 500 });
    }, 1000);
  });
};


const fetchUser = (): Promise<User> => {
  return new Promise((resolve, reject) => {
    // 模拟异步请求
    setTimeout(() => {
      const user = { id: 1, name: "Alice" };
      Math.random() > 0.5 ? resolve(user) : reject("网络错误");
    }, 1000);
  });
};

fetchUser()
  .then(user => console.log(user))  // Fulfilled 状态处理
  .catch(err => console.error(err)); // Rejected 状态处理
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2026-3-22 07:06 , Processed in 0.010957 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表