【JavaScript】Promise详解

Promise 是 JavaScript 中处理异步操作的一种强大机制。它提供了一种更清晰、更可控的方式来处理异步代码,避免了回调地狱(callback hell)和复杂的错误处理。

基本概念

  1. 状态

    • Pending:初始状态,既不是成功也不是失败。
    • Fulfilled:操作成功完成。
    • Rejected:操作失败。
  2. 方法

    • then:处理 fulfilled 状态。
    • catch:处理 rejected 状态。
    • finally:无论成功还是失败都会执行。

创建 Promise

你可以使用 new Promise 构造函数来创建一个 Promise 对象:

javascript 复制代码
const myPromise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    const success = Math.random() > 0.5;
    if (success) {
      resolve('Operation succeeded');
    } else {
      reject(new Error('Operation failed'));
    }
  }, 1000);
});

处理 Promise

你可以使用 .then.catch 方法来处理 Promise 的结果:

javascript 复制代码
myPromise
  .then(result => {
    console.log('Success:', result);
  })
  .catch(error => {
    console.error('Error:', error.message);
  });

链式调用

Promise 支持链式调用,可以依次处理多个异步操作:

javascript 复制代码
myPromise
  .then(result => {
    console.log('First success:', result);
    return 'Second operation';
  })
  .then(secondResult => {
    console.log('Second success:', secondResult);
  })
  .catch(error => {
    console.error('Error:', error.message);
  });

使用 async/await

async/await 是处理 Promise 的语法糖,使异步代码看起来像同步代码:

javascript 复制代码
async function handleMyPromise() {
  try {
    const result = await myPromise;
    console.log('Success:', result);
  } catch (error) {
    console.error('Error:', error.message);
  }
}

handleMyPromise();

常见的 Promise 方法

  • Promise.all:等待所有 Promise 完成。
  • Promise.race:等待第一个 Promise 完成。
  • Promise.resolve:立即解析的 Promise。
  • Promise.reject:立即拒绝的 Promise。

示例

javascript 复制代码
// 使用 Promise.all
const promise1 = Promise.resolve('First');
const promise2 = new Promise(resolve => setTimeout(() => resolve('Second'), 1000));
const promise3 = Promise.reject(new Error('Third'));

Promise.all([promise1, promise2, promise3])
  .then(values => {
    console.log('All promises resolved:', values);
  })
  .catch(error => {
    console.error('One of the promises was rejected:', error.message);
  });

// 使用 Promise.race
Promise.race([promise1, promise2, promise3])
  .then(value => {
    console.log('First resolved promise:', value);
  })
  .catch(error => {
    console.error('First rejected promise:', error.message);
  });
相关推荐
@PHARAOH几秒前
HOW - React 状态模块化管理和按需加载(一) - react-redux
前端·javascript·react.js·redux
草明6 分钟前
在 Flutter 中,Image.asset 从其他包中加载资源
前端·javascript·flutter
Au_ust31 分钟前
css:项目
前端·css
大浪淘沙102434 分钟前
解决因为数据变化,页面没有变化的情况 , 复习一下使用 vuex 的 modules
前端·javascript·vue.js
秋沐1 小时前
微前端-MicroApp
前端·react.js·webpack·前端框架·npm
Jiaberrr1 小时前
打造双层环形图:基础与高级渐变效果的应用
前端·javascript·vue.js·信息可视化·echarts
GISer_Jing1 小时前
React前端面试题详解(一)
前端·react.js·前端框架
呵呵哒( ̄▽ ̄)"1 小时前
React 实战选择互动特效小功能
前端·javascript·react.js
Python私教2 小时前
Docker化部署Django:高效、可扩展的Web应用部署策略
前端·docker·django
YiSLWLL2 小时前
Django+Nginx+uwsgi网站Channels+redis+daphne多人在线聊天实现粘贴上传图片
javascript·python·nginx·django