(转载)20个JavaScript重点知识点(16)promise

Promise是一个代理对象,代表了一个在创建时不一定已知的结果。它允许你将处理程序与异步操作的最终成功值或失败原因关联起来,使得异步方法可以像同步方法一样返回值

为什么需要 Promise?

在传统 JavaScript 异步编程中,我们使用回调函数处理异步操作,但当遇到多个异步操作嵌套时,会出现著名的 "回调地狱"(Callback Hell):

getData(function(a) {  getMoreData(a, function(b) {    getMoreData(b, function(c) {      // 无限嵌套...    });  });});

Promise 的出现解决了:

1.回调嵌套问题

2.更好的错误处理机制

3.更清晰的异步流程控制

 Promise 基本概念

1.三种状态

      Pending(等待中):初始状态

      Fulfilled(已成功):操作成功完成

      Rejected(已失败):操作失败
2. 基本语法

const promise = new Promise((resolve, reject) => {  // 异步操作  if (/* 成功条件 */) {    resolve(value); // 状态变为 fulfilled  } else {    reject(error); // 状态变为 rejected  }});

核心方法

1. then()

处理成功状态:

promise.then(  result => { /* 处理成功结果 */ },  error => { /* 处理错误(可选) */ });

2. catch()

专门处理错误:

promise.catch(  error => { /* 处理所有错误 */ });

3. finally()

无论成功失败都会执行:

promise.finally(  () => { /* 清理操作 */ });

链式调用(Chaining)

fetchData()  .then(processData)  .then(saveData)  .catch(handleError)  .finally(cleanUp);

特点:

1.每个 then() 返回新 Promise

2.可传递处理后的值给下一个 then

3.错误会冒泡传递直到被捕获

常用静态方法

1. Promise.all()

并行执行多个 Promise:

Promise.all([promise1, promise2, promise3])  .then(values => {    console.log(values); // [result1, result2, result3]  });

2. Promise.race()

获取最先完成的 Promise:

Promise.race([promise1, promise2])  .then(firstResult => { /* ... */ });

3. Promise.resolve() / Promise.reject()

快速创建 Promise:

// 立即解决的 PromisePromise.resolve(42).then(console.log); // 42
// 立即拒绝的 PromisePromise.reject(new Error('Fail')).catch(console.error);

错误处理示例

// 推荐方式fetchData()  .then(processData)  .catch(handleNetworkError)  .then(saveData)  .catch(handleProcessError)  .finally(cleanUp);

实际案例:顺序执行异步操作

function wait(delay) {  return new Promise(resolve => {    setTimeout(resolve, delay);  });}
wait(1000)  .then(() => {    console.log('1秒后执行');    return wait(2000);  })  .then(() => {    console.log('再2秒后执行');  });

注意事项

1.Promise 创建后会立即执行

2.每个 then() 需要返回新值才能继续链式调用

3.未处理的 rejection 会导致静默失败(建议全局捕获)

4.避免在 Promise 中嵌套 Promise

Promise 的核心优势:

1.链式调用代替嵌套回调

2.统一的错误处理机制

3.更好的流程控制能力

4.可组合的异步操作

// 最终示例:完整的 Promise 流程function asyncOperation() {  return new Promise((resolve, reject) => {    setTimeout(() => {      const success = Math.random() > 0.5;      success ? resolve('成功!') : reject(new Error('失败'));    }, 1000);  });}
asyncOperation()  .then(result => {    console.log(result);    return '下一步处理';  })  .then(data => {    console.log(data);  })  .catch(error => {    console.error('捕获错误:', error);  })  .finally(() => {    console.log('操作完成');  });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzhdim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值