用JS手写一个简单的Promise

JS手写一个简单的Promise实现 手写一个简单的promise 阅读详情

参照Promise/A+规范手写了一个简化版的promise

class MyPromise {
  constructor(fn) {
    if (typeof fn !== 'function') {
      throw new Error('参数必须为函数');
    }
    this._state = 'Pending';   //promise目前的状态
    this._value = null;     //用于存储promise终值
    this._reason = null;    //用于存储promise拒因
    this.fulfillCallbacks = [];   //存储resolve的回调函数
    this.rejectCallbacks = [];    //存储reject的回调函数

    fn(this._resolve.bind(this), this._reject.bind(this));
  }

  // 将promise转化为Fulfilled状态,并依次执行then注册的onFulfilled回调函数
  _resolve(value) {
    if (this._state !== 'Pending') return;

    let run = () => {

      let runFulfill = (val) => {
        this._state = 'Fulfilled';
        this._value = val;

        let cb;
        while(cb = this.fulfillCallbacks.shift()) {
          cb(value);
        }
      }

      let runReject = (err) => {
        this._state = 'Rejected';
        this._reason = err;

        let cb;
        while(cb = this.rejectCallbacks.shift()) {
          cb(err);
        }
      }

      if (value instanceof MyPromise) {
        value.then(runFulfill, runReject);
      } else {
        runFulfill(value);
      }
    }

    process.nextTick(run);

  }

  // 将promise转化为Rejected状态,并依次执行then注册的onRejected回调函数
  _reject(error) {
    if (this._state !== 'Pending') return;

    let run = () => {
      this._state = 'Rejected';
      this._reason = error;

      let cb;
      while(cb = this.rejectCallbacks.shift()) {
        cb(error);
      }
    }

    process.nextTick(run);
  }

  // 注册回调函数,返回新的promise实例
  then(onFulfilled, onRejected) {

    let newPromise;

    return newPromise = new MyPromise((nextResolve, nextReject) => {
    // 由于当前promise注册的回调函数返回值影响着新promise的状态
    // 因此需要包装一下原来的回调函数
      let fulfillFunc = value => {        
        if (typeof onFulfilled === 'function') {
          try {
            let res = onFulfilled(value);
            MyPromise.resolvePromise(newPromise, res);
          } catch(e) {
            nextReject(e);
          }
        } else {
          nextResolve(this._value);
        }
      }

      let rejectFunc = value => {
        if (typeof onRejected === 'function') {
          try {
            let res = onRejected(value);
            MyPromise.resolvePromise(newPromise, res);
          } catch(e) {
            nextReject(e);
          }
        } else {
          nextReject(this._reason);
        }
      }

		// 将包装后的回调函数推入对应的回调函数数组
      if (this._state === 'Pending') {
        this.fulfillCallbacks.push(fulfillFunc);
        this.rejectCallbacks.push(rejectFunc);
      } else if (this._state === 'Fulfilled') {
        fulfillFunc(this._value);
      } else if (this._state === 'Rejected') {
        rejectFunc(this._reason);
      }
    });
  }

  catch(onRejected) {
    return this.then(undefined, onRejected);
  }

  finally(callBack) {
    return this.then(
      (value) => MyPromise.resolve(callBack()).then(() => value),
      (err) => MyPromise.resolve(callBack()).then(() => err)
    )
  }

  // promise的解决过程
  static resolvePromise(promise, val) {
    if (val === promise) {
      throw new Error('TypeError');
    } else if (val instanceof MyPromise) {
      if (val._state === 'Fulfilled') {
        promise._resolve(val._value);
      } else if (val._state === 'Rejected') {
        promise._reject(val._reason);
      } else {
        val.then(promise._resolve.bind(promise), promise._reject.bind(promise));
      }
    } else if (typeof val === 'object' || typeof val === 'function') {
      let then;
      try {
        then = val.then;
      } catch(e) {
        promise._reject(e);
      }
      if (typeof then === 'function') {
        then.call(val, function(value){
          this.resolvePromise(promise, value)
        }, nextReject)
      } else {
        promise._resolve(val);
      }
    } else {
      promise._resolve(val);
    }
  }

  static resolve(value) {
    if (value instanceof MyPromise) return value;
    return new MyPromise(resolve => resolve(value));
  }

  static reject(value) {
    return new MyPromise((resolve, reject) => reject(value));
  }

  static all(promises) {
    if (!Array.isArray(promises)) throw new Error('参数必须为数组');

    return new MyPromise((resolve, reject) => {
      let values = [];
      let count = 0;

      for (let i=0; i<promises.length; i++) {
        this.resolve(promises[i]).then(value => {
          values[i] = value;
          count++;

          if (count === promises.length) resolve(values);
        }, (err) => {
          reject(err);
        });
      }
    });
  }

  static race(promises) {
    if (!Array.isArray(promises)) throw new Error('参数必须为数组');

    return new MyPromise((resolve, reject) => {

      for (let i=0; i<promises.length; i++) {
        this.resolve(promises[i]).then(value => {
          resolve(value);
        }, (err) => {
          reject(err);
        });
      }
    });
  }
}
软考高级,信息系统项目管理师(高项)经验分享 软考高级,信息系统项目管理师(高项)经验分享 2020-12-21信息系统项目管理师(俗称高项)成绩出来了54,55,47,终于成为高级工程师了。 本文以编写整体管理论文的格式进行,将分为项目启动、项目计划、项目执行、项目检查、项目收尾5个过程回顾高项的考试历程,希望对其他同学有借鉴意义。个人觉得可能对于一次考不过的人参考价值比较大。 第一阶段、项目启动阶段Start——决定考哪个科目。 如图,高级资格的类型有:信息系统项目管理师、系统分析师、系统架构设计师、...... 阅读详情

相关推荐

数据预处理之数据平滑处理#matlab

介绍基于 MATLAB 的数据平滑方法,主要介绍 smooth 函数、smoothts 函数和 medfilt1 函数的用法。

m0_56619132的博客 2415

promise的使用与简写

    在JS里代码执行大都是单线程的,如果要在一个线程中处理多个事物,就需要使用异步回调。既可以通过回调函来实现异步回调,也可以使用Promise机制来实现异步回调。     下面介绍,js里Promise的使用和简写。 1、需求 用Promise来判断[0,100)之间的数,若数小于50,则返回OK,否则返回failed。 2、初始代码     //one.js function test(resolve,reject) { var num = Math.random()*1

sanqima的专栏 1170

下载Python3.10的相关方法及问题解决

下载Python3.10的相关方法及问题解决 报错unable to locate package python3.10-dev以及subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 1问题解决

Istil 1555

promise学习——js手写promise

手写promise

老古懂的博客 2653

vue项目基于WebRTC实现一对一音视频通话

vue项目基于WebRTC实现一对一音视频通话。完整代码gitee地址: https://gitee.com/wade-nian/wdn-webrtc.git。

qq_920189602的博客 6648

THUCNews新闻文本分类-tfidf+sklearn

本文使用的是和鲸社区现有数据集,代码也在和鲸社区公开,fork之后可以直接运行。 本文中所用的数据集清华NLP组提供的THUCNews新闻文本分类数据集的一个子集(原始的数据集大约74万篇文档,训练起来需要花较长的时间)。 本次训练使用了其中的体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐10个分类,每个分类6500条,总共65000条新闻数据。项目在和鲸社区的平台上跑的,数据集直接引用了和鲸的数据集,每个分类6500条,总共65000条新闻数据。 数据集划分如下: cnews

wmq104的博客 4591

JS手写Promise(详细过程)

手写Promise

m0_56698268的博客 2549

利用Spm12进行fMRI数据分析:从预处理到结果解读的完整指南

本文提供了利用SPM12进行fMRI数据分析的完整流程指南,涵盖从数据预处理、统计建模到结果解读的全过程。详细介绍了在MATLAB环境下使用SPM12图形界面完成头动矫正、空间标准化等关键步骤的操作方法与避坑技巧,帮助神经科学研究者和心理学研究者高效处理功能磁共振成像数据并产出可靠结果。

weixin_29079671的博客 452

Promise的简写

一. 原始写法 new Promise((resolve, reject) => { resolve("aaa") }) .then((res) => { return new Promise((resolve, reject) => { resolve(res + "111") }) }) .then((res) => { return new Promise((resolve, reject) => { resolve(res + "222") }) }

qinqinde123的博客 827

STM32F103C8T6飞控入门:从零开始,用HAL库和MPU6050搭建你的第一架四轴无人机

本文详细介绍了如何使用STM32F103C8T6和MPU6050模块从零开始搭建四轴无人机飞控系统。通过硬件选型、电路设计、HAL库配置、姿态解算算法实现以及PID控制等步骤,帮助创客和嵌入式爱好者快速入门飞控开发。文章还提供了实用的调试技巧和常见问题解决方案,适合想要掌握四旋翼无人机核心技术的开发者。

weixin_42524750的博客 266

Prometheus+Grafana部署及企业微信邮件/群消息告警通知配置

本文详细介绍了在Ubuntu 22.04系统上部署普罗米修斯监控系统的完整流程。首先说明了系统配置要求(2核CPU、4G内存、100G硬盘),然后分步骤指导下载、解压和安装普罗米修斯服务。文章包含配置prometheus.yml文件、启动服务、设置系统服务等关键操作,并提供了访问9090端口验证服务的方法。接着介绍了通过node_exporter监控Linux主机的配置过程,包括安装、启动服务和修改普罗米修斯配置文件添加监控项。最后还涉及了mysqld_exporter的部署流程,用于监控MySQL数据库服

m0_58761900的博客 1638

JavaScript第 26 篇,手写 Promise.all 方法:深入理解 Promise 的并行处理(JS中Promise.all的执行过程)

⭐Promise.all是JavaScript中一种用于处理多个Promise对象的方法,该方法接收一个数组作为参数,并返回一个新的Promise对象。这个新的对象会在所有Promise对象都成功解析后解析,解析的结果是一个数组,包含了所有Promise对象解析后的结果。 解析时如果任何一个Promise对象失败,则这个新的Promise实例会立即失败,并返回第一个失败的Promise对象的错误信息。Promise.all不会改变原有的Promise对象的状态,原有的 Promise 对象仍会按照自己的状

AI Agent 全栈架构师(AI + GIS + Backend)& 数字芯片系统架构师(FPGA),NorthCity Smile的博客(NcSmile,博主域名:https://ncmile.blog.youkuaiyun.com) 1388

13、离散时间系统建模与分析

本文系统介绍了离散时间系统的建模与分析方法,涵盖连续时间模型的离散化过程、系统稳定性判断准则、输入输出模型转换方法以及有限脉冲响应和阶跃响应模型的应用。通过多个示例详细展示了不同系统在离散化过程中的特性变化,并探讨了采样间隔对系统动态特性的影响。此外,文章还分析了时间延迟的处理方法,并总结了关键知识点及操作步骤,为离散时间系统的实际应用提供了理论基础和实践指导。

2w3e4r5t6y的博客 189

下面是一个简单的 JavaScript Promise 的手写示例

【代码】下面是一个简单的 JavaScript Promise 的手写示例。

m0_73364675的博客 111

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

手写一个promise用法_手写一个自己的 JavaScript Promise 类库

终于有时间写这篇文章了, ES2015 推出了JS 的 Promise ,而在没有原生支持的时候,我们也可以使用诸如 Promises/A+ 的库的帮助,在我们的代码里实现Promise 的支持;如何使用 Promise在讲具体实现之前我们还是先了解下我们如何使用 Promise 在我们的代码中。function getData() {return new Promise((resolve, re...

weixin_39626237的博客 158

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

手写一个简单的promise

/ (1) 没有对应的后续处理即then中没有对应状态的后续处理回调函数, 则then所对应的promise就吸收之前的promise的状态。// c 后续处理中返回的是一个promise, 则外部的promise吸收return返回的promise的状态。// then函数返回一个promise, 返回的promise的状态需要根据then方法回调函数的执行结果来处理。// (1) then中没有对应的后续处理, 则then返回的promise状态与promise的状态一致。

慕思 659

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

promise 从了解到手写promise

什么是promise? promise是异步编程的一种解决方法,比传统的解决方案。回调时间和事件更合理更强大,它由社区最早提出和实现ES6 将其写进了语言标准,统一了用法,原生提供了promise对象 这是官方的定义 我是这样理解的: 简单的说 这个单词本身的含义就是承诺。那么就来一个生活中的爱情故事,简单理解一下 promise的基本结构 比如:你有一个女朋友,三天之后要过60大寿,你就承诺:宝贝,过几天你过生日了,给你准备一个惊喜。 有两种情况,如果你是好男人呢,你就会兑现这个承诺,给她买了最喜欢的口红

jiaotongdaren的博客 165

JS高级 之 Promise 详解

JS高级 之 Promise 详解

玄鱼殇 6099

手写Promise完整介绍

`Promise`是一种用于处理异步操作的机制,它可以将异步操作的结果以同步的方式进行处理和返回。在`JavaScript`中,`Promise`是一种内置对象,但我们也可以手动实现一个`Promise`类来更好地理解其原理和工作方式。

CRMEB小程序商城的博客 490

手写promise

js 代码

weixin_45776545的博客 74

浅谈Promise理解、实现手写Promise

Promise

qq_51574731的博客 235

完整实现原生Promise

手写前需要了解这些 1.什么是宏任务 我们都知道JS是单线程的,但是一些高耗时操作就带来了进程阻塞的问题,为了解决这个问题,JS有两种任务的执行模式,同步模式和异步模式。 在异步模式下,创建异步任务主要分为宏任务和微任务两种,宏任务是由宿主(浏览器、Node)发起的,而微任务由JS自身发起。 宏任务与微任务的几种创建方式 ???? 宏任务(Macrotask)微任务(Microtask)setTimeoutrequestAnimationFrame(有争议)setIntervalMutationObserv

m0_46269977的博客 808

使用发布订阅模式定义一个自己的简单promise

现手写一个简单的promise: class MyPromise { constructor(fn) { this.value = ""; this.pending = "pending"; this.reson = ""; var res = value => { if (this.pending ===

前端小口袋 419

promise和setTimeout的执行顺序

考验的还是事件循环,吃透了事件循环的同学会马上晓得,代码自上而下,遇见同步任务执行,遇见异步任务进入任务队列排队,如果有script,那就是宏任务先行,微任务后执行;如若没有,那就是微任务优先于宏任务先执行,setimeout属于宏任务,promise在没有任何内部方法下执行时属于同步任务,里面的内部方法属于异步任务中的微任务。直接上一段手写的promise给大家分享做个了解。

2402_83040065的博客 243

Promise相关

Promise概述 promise对象表示一个异步任务最终结束时的状态,成功fulfilled或者失败rejected,在状态明确之后会有对应的任务被自动执行。并且状态一旦确定就不再更改。 promise基本用法 new Promise((resolve, reject) => { // 调用resolve 更改状态为fulfilled,并将异步的结果通过resolve函数的参数传递出去 resolve() // 调用reject 更改状态为rejected,并将为什么失败的理由通过reject

Aifangmy的博客 359

javascript --- > 手写Promise、快排、冒泡、单例模式+观察者模式

手写promise 一种异步的解决方案, [参考]( Promise代码基本结构 function Promise(executor){ this.state = 'pending'; this.value = undefined; this.reason = undefined; function resolve(){ } ...

栗子好好吃的博客 724
上一篇: 313. 超级丑数(JS实现)
下一篇: 328. 奇偶链表(JS实现)
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值