首页 > 其他分享 >Promise实现原理

Promise实现原理

时间:2023-09-17 13:56:24浏览次数:28  
标签:function resolve 实现 reject state Promise error 原理

Promise是ES6中处理异步操作的重要工具,它的实现原理让我们的代码更加简洁高效。本文将为你揭开ES6 Promise的神秘面纱,让你彻底了解其实现原理,同时展示如何运用Promise优化代码。

什么是Promise?

Promise是一种用于处理异步操作的对象,表示一个异步操作的最终完成或失败。Promise有三种状态:Pending(进行中)、Fulfilled(已成功)、Rejected(已失败)。一旦Promise的状态从Pending变为Fulfilled或Rejected,它就不会再改变。

Promise的实现原理

Promise的实现原理涉及了一些JavaScript的核心概念,包括闭包、回调函数和事件循环。让我们逐步了解Promise的实现细节:

1. 构造函数

首先,我们需要一个Promise构造函数,它接受一个函数作为参数,该函数有两个参数:resolve和reject。这个函数通常称为执行器函数。

function Promise(executor) {
  // ...
}

2. 状态管理

Promise需要管理自己的状态(Pending、Fulfilled、Rejected)。我们可以使用闭包来保存状态,并提供方法来改变状态。

function Promise(executor) {
  let state = 'pending';
  let value = null;

  function resolve(result) {
    state = 'fulfilled';
    value = result;
  }

  function reject(error) {
    state = 'rejected';
    value = error;
  }
}

3. then方法

Promise对象上有一个then方法,它接受两个回调函数作为参数,分别用于处理Promise状态变为Fulfilled和Rejected时的情况。

function Promise(executor) {
  // ...

  this.then = function (onFulfilled, onRejected) {
    // ...
  };
}

4. 异步操作

Promise需要支持异步操作,所以我们需要使用事件循环来处理异步任务,确保then方法中的回调在适当的时间执行。

function Promise(executor) {
  // ...

  setTimeout(function () {
    // 执行executor函数
    executor(resolve, reject);
  }, 0);
}

5. 处理链式调用

最后,我们需要处理链式调用。当then方法被调用时,它应该返回一个新的Promise对象,以支持链式调用。

function Promise(executor) {
  // ...

  this.then = function (onFulfilled, onRejected) {
    // 返回新的Promise对象
    return new Promise(function (resolve, reject) {
      // ...
    });
  };
}

到这里就实现了Promise的基本轮廓。完整代码如下:

function Promise(executor) {
  let state = 'pending';
  let value = null;

  function resolve(result) {
    if (state === 'pending') {
      state = 'fulfilled';
      value = result;
    }
  }

  function reject(error) {
    if (state === 'pending') {
      state = 'rejected';
      value = error;
    }
  }

  this.then = function (onFulfilled, onRejected) {
    if (state === 'fulfilled') {
      onFulfilled(value);
    } else if (state === 'rejected') {
      onRejected(value);
    }
  };

  // 执行executor函数
  executor(resolve, reject);
}

我们测试上面的方法:

// 示例用法
const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('成功的结果');
    // 或者
    // reject('失败的原因');
  }, 1000);
});

myPromise.then(
  result => {
    console.log('成功:', result);
  },
  error => {
    console.error('失败:', error);
  }
);

6.实现all方法

function PromiseAll(promises) {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(promises)) {
      reject(new TypeError('参数必须是一个 Promise 数组'));
      return;
    }

    const results = new Array(promises.length);
    let completedPromises = 0;

    promises.forEach((promise, index) => {
      promise
        .then((result) => {
          results[index] = result;
          completedPromises++;

          if (completedPromises === promises.length) {
            resolve(results);
          }
        })
        .catch((error) => {
          reject(error);
        });
    });
  });
}

// 示例用法
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

PromiseAll([promise1, promise2, promise3])
  .then((results) => {
    console.log('全部成功:', results); // 输出 [1, 2, 3]
  })
  .catch((error) => {
    console.error('出错:', error);
  });

总结

Promise是一项强大的工具,它使异步编程更加清晰和可控。通过理解Promise状态和回调的概念,并掌握示例代码中的使用方式,我们可以更好地运用Promise来提升代码的可读性和性能。快来试试吧!

标签:function,resolve,实现,reject,state,Promise,error,原理
From: https://www.cnblogs.com/dawnyu/p/17708660.html

相关文章

  • 《信息安全系统设计与实现》第二周学习笔记
    《信息安全系统设计与实现》第二周学习笔记第九章I/O库函数系统调用函数系统调用系统调用函数open():打开和创建文件read():读文件write():写文件lseek()close()I/O库函数fopen():以指定的形式打开文件fread():从给定流stream读取数据到ptr所指向的数组中fwrit......
  • 【语音压缩】基于adpcm实现语音信号压缩与解压缩附Matlab实现
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • TienChin 渠道管理-字典原理分析
    在上一节当中,我们使用到了字典来进行翻译我们的渠道类型等等字段,那么这一节我们就来分析一下字典的原理。从代码方面先开始分析,我们先来看一下字典的定义,我们是在如下图当中编写了我们的渠道类型,使用,proxy.useDict进行的请求数据,proxy相比之前的Vue2,其实就是Vue本身,相当于V......
  • 【配电网重构】基于遗传实现配电网重构附matlab实现
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • API商品数据接口:实现电子商务应用程序的核心功能
    随着电子商务的飞速发展,许多电商平台都提供了应用程序接口(API),允许开发者调用特定的功能,如商品查询、购物车管理、订单处理以及支付等。这些API为开发者提供了在应用程序中嵌入电商功能的机会,从而为用户提供更加便捷的购物体验。本文将深入探讨API商品数据接口的相关概念、实现方法......
  • vue2 使用tinymce编辑器实现上传图片及粘贴word文本保留格式并粘贴图片自动上传
    下载对应的版本 npminstall@tinymce/[email protected]@5.8.2-S然后在node_modules中找到tinymce把整个文件复制下来粘到public中 在组件页面使用根据自己需求进行注释或添加功能<template><divclass="tinymce-editor"><Editor:......
  • 失物招领系统的设计与实现-计算机毕业设计源码+LW文档
    题目的意义、目的:随着互联网的飞速发展,学校也进入了信息化时代。校园中大学生丢失物品的现象较为普遍,虽然目前国内有一些网上校园寻物平台或者是QQ群之类的,但是都不是很成熟,使得失主不能及时甚至找不到失物,给生活带来了极大的不便。通过互联网为在校师生搭建一个发布信息的平台,可......
  • 基于Java Web的陕西旅游网站的设计与实现-计算机毕业设计源码+LW文档
    一、研究的背景和意义研究背景:本文主要是基于旅游业是我国现阶段发展的重要产业,旅游可以推动经济上的发展,通过深入的对当前旅游行业的研究,也随着网络技术的发展,传统的旅游方式游客已经无法满足,游客不再满足于单一路线的线路,无法进行更多的选择,每天日常的行程安排丧失了一定......
  • python实现从网站下载文件, 带进度信息
    我实现了一个函数,代码如下:defdownload_file_from_url(url,save_path='',callback:callable=None):'''下载文件,并保存到save_path指定的位置url:形如'http://www.tdx.com.cn/products/data/data/vipdoc/shlday.zip'或者'http......
  • C语言实例_实现malloc与free函数完成内存管理
    一、malloc和free函数介绍在C语言中,malloc和free是用于动态内存管理的函数。(1)malloc函数malloc函数用于在堆(heap)中分配指定大小的内存空间,并返回一个指向该内存块的指针。原型如下:void*malloc(size_tsize);size参数表示要分配的内存块的大小,以字节为单位。函数返回一个指向分配内......