当前位置:首页 > JavaScript

js实现promise

2026-04-05 20:41:09JavaScript

Promise 的基本概念

Promise 是 JavaScript 中用于处理异步操作的对象,表示一个可能现在、也可能将来完成的操作及其结果值。Promise 有三种状态:

  • Pending:初始状态,既未完成也未拒绝。
  • Fulfilled:操作成功完成。
  • Rejected:操作失败。

创建 Promise

Promise 构造函数接收一个执行器函数(executor),该函数包含 resolvereject 两个参数:

const promise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    const success = true; // 模拟操作成功或失败
    if (success) {
      resolve('Operation completed successfully');
    } else {
      reject('Operation failed');
    }
  }, 1000);
});

Promise 的链式调用

Promise 通过 .then().catch() 方法处理成功或失败的结果,支持链式调用:

promise
  .then((result) => {
    console.log(result); // 输出成功结果
    return 'Next step'; // 返回新值供下一个 then 使用
  })
  .then((nextResult) => {
    console.log(nextResult); // 输出 'Next step'
  })
  .catch((error) => {
    console.error(error); // 捕获错误
  });

Promise 的静态方法

Promise 提供了一些静态方法用于处理多个 Promise:

  1. Promise.all():等待所有 Promise 完成,或第一个失败。

    js实现promise

    Promise.all([promise1, promise2])
      .then((results) => console.log(results))
      .catch((error) => console.error(error));
  2. Promise.race():返回第一个完成(成功或失败)的 Promise。

    Promise.race([promise1, promise2])
      .then((result) => console.log(result))
      .catch((error) => console.error(error));
  3. Promise.resolve()Promise.reject():快速创建已解决或已拒绝的 Promise。

    Promise.resolve('Immediate success').then(console.log);
    Promise.reject('Immediate failure').catch(console.error);

异步函数与 Promise

ES2017 引入的 async/await 语法糖简化了 Promise 的使用:

js实现promise

async function fetchData() {
  try {
    const result = await promise; // 等待 Promise 完成
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}
fetchData();

实现一个简单的 Promise

以下是一个简化版的 Promise 实现(仅核心逻辑):

class SimplePromise {
  constructor(executor) {
    this.state = 'pending';
    this.value = undefined;
    this.onFulfilledCallbacks = [];
    this.onRejectedCallbacks = [];

    const resolve = (value) => {
      if (this.state === 'pending') {
        this.state = 'fulfilled';
        this.value = value;
        this.onFulfilledCallbacks.forEach(callback => callback(value));
      }
    };

    const reject = (reason) => {
      if (this.state === 'pending') {
        this.state = 'rejected';
        this.value = reason;
        this.onRejectedCallbacks.forEach(callback => callback(reason));
      }
    };

    try {
      executor(resolve, reject);
    } catch (error) {
      reject(error);
    }
  }

  then(onFulfilled, onRejected) {
    if (this.state === 'fulfilled') {
      onFulfilled(this.value);
    } else if (this.state === 'rejected') {
      onRejected(this.value);
    } else {
      this.onFulfilledCallbacks.push(onFulfilled);
      this.onRejectedCallbacks.push(onRejected);
    }
    return this; // 简化版未实现链式调用
  }
}

常见使用场景

  1. HTTP 请求:结合 fetch API 使用 Promise 处理网络请求。

    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => console.log(data))
      .catch(error => console.error(error));
  2. 定时任务:用 setTimeout 封装为 Promise。

    function delay(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }
    delay(1000).then(() => console.log('1 second passed'));
  3. 文件读写:Node.js 中 fs.promises 模块提供 Promise 接口。

    const fs = require('fs').promises;
    fs.readFile('file.txt', 'utf8')
      .then(content => console.log(content))
      .catch(error => console.error(error));

标签: jspromise
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…