ES6——手把手实现一个简单的Promise

[手写系列] 带你实现一个简单的Promise Python微信订餐小程序课程视频 https://edu.youkuaiyun.com/course/detail/36074 Python实战量化交易理财系统 https://edu.youkuaiyun.com/course/detail/35475 简介 学习之前 需要先对Promise有个基本了解哦,这里都默认大家都是比较熟悉Promise的 本次将带小伙伴们实现Promise的基本功能 Promise的基本骨架 Promise的then Promise.then的多次调用 then链式调用 catch的实现 fi 阅读详情

想要实现一个Promise,首先当然得先知道这个东西是什么,Promise对象是ES6给我们提供的一个解决异步回调的一个语法糖,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。把异步操作放入Promise对象中,等到Promise对象中的操作完成了,再继续执行then里面的操作。具体的使用就不说了,大概的使用方法如同下面。详情可以看ES6

    let p=new Promise(function (resolve,reject) {
        setTimeout(function () {
            resolve(2);
        },1000);
    });
    p.then(function (n) {
        console.log(n);
    },function (n) {
        console.log(n);
    });

那么接下来就来具体说说要怎么去实现一个Promise对象,这里我先用es5的语法实现一下,后面会附带用es6的语法,也就是用到了“类”这个概念

首先按照es5创建对象的套路,先来个初始化

 function Promise2(fn) {
    const _this = this;    //方便this改变时,能够继续调用
    this._queue = [];    //promise关键,一个函数队列,用于储存为能够开始执行的函数
    this._succ_res = null;     //用于存放成功时的参数
    this._err_res = null;    //用于存放失败时的参数
    this.status = '';    //Promise状态
    fn();     //传入Promise的回调函数
  }

我们知道Promise传进来的参数是一个函数,那么最主要的事情就是要在Promise里面去执行它。执行完之后呢,这个函数可能是执行成功的,也可能失败,所以如下图,我们可以看到有一个resolve和reject两个方法。因此我们需要在传进来的参数里面设置两个function。

function Promise2(fn) {
    ......
    fn(function (...arg) {
      //resolve
    }, function (...arg) {
      //reject
    })
  }

同时我们还有一个then的方法,这个时候就要搬出我们的原型了。那么then里面要做什么呢?在then里面,会被放入两个函数,一个表示成功后执行的,一个表示失败后执行的,所以then主要是要做下面的事

  1. 判断当前Promise的状态,Promise有3个状态,pending、fulfilled和rejected。简单讲就是,Promise的函数还没执行完、Promise的函数执行完了并且成功了、Promise执行完了但失败了,这三种状态。
  2. 如果未执行完:把then里面要执行的函数放在等待队列里面
  3. 如果执行完且成功:执行then中表示成功的函数
  4. 如果执行完但失败:执行then中表示失败的函数

所以Promise的then如下

Promise2.prototype={
    then:function (fn1, fn2) {
      let _this=this;
      if (_this.status == 'success') {
        fn1(..._this._succ_res);
      } else if (_this.status == 'error') {
        fn2(..._this._succ_res);
      } else {
        _this._queue.push({fn1, fn2});
      }
    }
  }

同样是我们在原来的函数里面,也要对状态的改变进行设置。而状态一旦确定下来也就不会再改变,那么,也就要先判断状态是否已经发生改变

fn(function (...arg) {
      //resolve
      if (_this.status != 'error') {    //判断状态是否已经变成失败
        _this.status = 'success';    //改变状态
        _this._succ_res = arg;    //传入resolve()中传给then的参数
        _this._queue.forEach(json => {    //执行结束后,看看队列里是否有函数,有的话执行第一个,并传入对应的参数
          json.fn1(...arg);
        });
      }
    }, function (...arg) {
      //reject
      if (_this.status != 'success') {    //判断状态是否已经变成成功
        _this.status = 'error';    //改变状态
        _this._err_res = arg;    //传入resolve()中传给then的参数
        _this._queue.forEach(json => {    //执行结束后,看看队列里是否有函数,有的话执行第二个函数,并传入对应的参数
          json.fn2(...arg);
        });
      }
    })

完整代码如下

  function Promise2(fn) {
    const _this = this;
    this._queue = [];
    this._succ_res = null;
    this._err_res = null;
    this.status = '';
    fn(function (...arg) {
      //resolve
      if (_this.status != 'error') {
        _this.status = 'success';
        _this._succ_res = arg;
        _this._queue.forEach(json => {
          json.fn1(...arg);
        });
      }
    }, function (...arg) {
      //reject
      if (_this.status != 'success') {
        _this.status = 'error';
        _this._err_res = arg;
        _this._queue.forEach(json => {
          json.fn2(...arg);
        });
      }
    })
  }
  Promise2.prototype={
    then:function (fn1, fn2) {
      let _this=this;
      if (_this.status == 'success') {
        fn1(..._this._succ_res);
      } else if (_this.status == 'error') {
        fn2(..._this._succ_res);
      } else {
        _this._queue.push({fn1, fn2});
      }
    }
  }


  let p2=new Promise2(function (resolve,reject) {
      setTimeout(function () {
          resolve(22);
      },1000);
      setTimeout(function () {
          reject(23);
      },500);
  });
  p2.then(function (n) {
    console.log(n);
  }, function (n) {
    console.log(n);
  })

点击:这个是用es6中的class实现的,其实差不多是一样的

最后来总结一下

Promise之所以能够把异步的东西按照同步的形式去执行,无非因为两点

  1. 当状态未发生改变时,能够将then中的函数暂时挂起
  2. 当状态改变时,能够调用其之前挂起的then队列

 

手把手带你实现ES6 Promise原理(使用Es6部分语法编写) 手把手带你实现ES6 Promise原理(使用Es6部分语法编写) 一、前言 使用Promise已经很长时间了,但是一直只是停留在应用的层面,底层的实现方式一直没有深究,感觉学一个东西还是知道底层原理比较好,于是好好研究后在此记录一下 二、什么是Promise? Promise是一种异步编程的解决方案,避免了"回调地狱",最早是由社区提出并实现,ES6后面将其写入语言标准。 Promise的两个特点 对象的状态不受外界影响,Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulf 阅读详情

相关推荐

解析 Promise 原理,实现一个Promise

概述这篇文章旨在解析 Promise的异步实现原理,并且以 ES6 Promise 为蓝本实现一个 Promise。

Geek的博客 8422

JS的ES6中Promise的简单实现

Promise是ES6中新增的一个内置类,在通过new常见Promise时,需要传入一个回调函数,称之为executor当调用resolve回调函数,会执行Promise对象的then方法传入的回调函数;当调用reject回调函数,会执行Promise对象的catch方法传入的回调函数;

weixin_47342624的博客 369

JavaScript -- ES6的Promise

本文系统讲解了Promise在前端异步编程中的应用。首先分析回调函数的缺点(嵌套地狱),重点介绍Promise的实现原理:通过返回Promise对象和.then()链式调用实现异步顺序执行,并说明传参和错误处理机制。同时介绍了ES7的async/await语法糖,可消除.then()嵌套。还详细解析了Promise.all()和Promise.any()等原型方法的使用场景,通过商品查询案例演示其实际应用。最后预告将分享手写Promise的实现过程,帮助开发者深入理解异步编程原理。

qq_25329389的博客 1013

10分钟原生实现promise、all、allSettled函数

10分钟原生实现promise、all、allSettled函数

程序媛的梦工厂 1820

电工电子实验——3BIT延时电路的设计与实现

设计一个 3BIT延时电路。 设计分析: Ⅰ.根据触发器的特性,只有来两个触发脉冲时才能恢复到原来的状态。也就是说触发器的输出信号比触发信号延迟了一个触发脉冲周期即1bit。据此3bit就需要3个触发器。 Ⅱ.输出要可控就要加一控制器,可用选择器实现。 Ⅲ.为便于观察输出信号的延迟,可设计一个F1信号。

qq_55543315的博客 1128

M1/M2 Mac用户看过来:不装VirtualBox,用PD虚拟机也能跑ENSP的保姆级教程

本文为M1/M2 Mac用户提供了一份不依赖VirtualBox,使用Parallels Desktop虚拟机运行ENSP的详细指南。通过ARM架构的Win10镜像选择、组件替代方案和网络配置优化,实现ENSP核心功能的高效运行,特别适合网络工程师在苹果芯片设备上进行网络模拟。

weixin_28683065的博客 413

使用 ES6 简单实现一个promise

Git源码: https://github.com/slhuang520/study/tree/master/web/es6/test/src/promise 整体结构图如下: MyPromise .js // require("babel-register"); //自动编译 // import "core-js"; //引入 polyfill // import "regenerator-r...

雾里看花叹朦胧 700

【C语言基础】野指针与空指针

全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持,赠人玫瑰,手有余香! 文章目录一:野指针1.1 :野指针的成因2.1 :规避野指针二:空指针 一:野指针 概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。 说明:指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向

qq_43727529的博客 2万+

手写简易版的promise

Promise是一种抽象异步处理对象,Promise类的构造函数中使用一个参数,参数值为一个回调函数。该回调函数又使用两个参数,参数值分别为两个回调函数(resolve,reject),如果执行成功则调用resolve回调函数,否则执行reject回调函数如下代码,promise是一个类,所有我们可以用构造函数来进行实现,promise中可以传入一个参数,参数值为一个函数((resolve,reject) => {}),其参数值又可以传入两个参数,参数值为resolve和reject函数,则我们实现的pro

weixin_54217534的博客 965

Tessy学习系列(三):单元测试——官方例程isValueInRange

注意:工程名称以及路劲不能包含空格和中文

不吃鱼的猫的博客 2348

运营商拼命封杀的PCDN到底是个啥?

最近一段时间,很多宽带用户发现自家的网速莫名其妙变慢了,甚至收到了运营商发来的“违规使用宽带”警告短信,严重的甚至直接被断网。很多人一头雾水:我交了钱办的宽带,自己买的插件或者京东云、网心云这些硬件赚点“电费”,怎么就成了运营商眼中的“过街老鼠”?今天,我们就把这层窗户纸捅破,深度剖析这个让互联网大厂省下几十亿、让运营商恨得牙痒痒、让用户夹在中间进退两难的技术黑话——。

网络技术联盟站 920

ES6 - 从Promise入门到深入原理(手写一个自己的Promise)

事件和回调函数的缺陷 我们习惯于使用传统的回调或者事件处理来解决异步问题 事件: 某个对象的属性是一个函数, 当发生一件事时, 运行该函数 dom.onclick = function() { // ...执行的代码 } 回调:运行某个函数以实现某个功能的时候, 传入一个函数作为参数, 当某个特定的条件下的时候, 就会触发该函数 dom.addEventListner('click', ...

前端攻城狮Dannis 5269

六、大模型(LLMs)参数高效微调(PEFT) 面

链接: https://pan.baidu.com/s/1TYqdCK53tDFEYGtAvpnTbA 提取码: 6a9s。考核中的核心考点,并针对这些考点提供了详尽的解答。通过网盘分享的文件:06大模型(LLMs)参数高效微调(PEFT) 面。)有哪些方法,能不能稍微介绍一下它们间?这种微调方法和全参数比起来有什么劣势吗?能不能总结一下各种参数高效微调方法?高效参数微调,如何进行存储?多种不同的高效微调方法对比。模型显存占用的部分有哪些?微调方法为啥能加速训练?微调计算可训练参数的比例。

weixin_51988935的博客 535

用es6实现一个简单的promise

promise是一个面试经常会问的问题,在这里我们可以通过es6的语法实现一个简单的promise,面试能写出来基本就没问题了 const PENDING = 'pending'; const RESOLVED = 'resolved'; const REJECTED = 'rejected'; class MyPromise { constructor(fn) { ...

baidu_28196435的博客 302

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

AI人人懂 3860

语言大模型之Tokenization的深入理解

Tokenization(分词)是自然语言处理(NLP)中一个非常重要的步骤,它的目标是将文本转换为模型可以理解的格式。对于像GPT、BERT等大型预训练模型来说,tokenization决定了文本如何转化为数字表示,从而影响模型在不同任务中的表现。接下来我会深入介绍tokenization的过程、不同的tokenization方法,以及它与模型微调(fine-tuning)之间的关系。

JustinMars的博客 343

ES6 Promise实现异步操作

ES6 Promise的内容就这些吗?是的,能用到的基本就这些。我怎么还见过done、finally、success、fail等,这些是啥?这些并不在Promise标准中,而是我们自己实现的语法糖。本文中所有异步操作均以setTimeout为例子,之所以不使用ajax是为了避免引起混淆,因为谈起ajax,很多人的第一反应就是jquery的ajax,而jquery又有自己的Promise实现。如果你理解了原理,就知道使用setTimeout和使用ajax是一样的意思。

weixin_41987908的博客 957

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

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

ES6新标准下JS异步编程Promise解读

ES5及以下,要实现复杂的异步编程,需要大量运用回调函数,而每个回调函数中的执行正确与否无法及时判断,让你只能猜测或分析找问题,这将造成大量无法理解的情况出现。 ES6新标准引入Promise对上述问题进行解决,它的核心思想,是将上一次函数执行返回一个Promise对象,明确指示代码是否成功执行,则你可以基于此成功与否判断,以链式编程方式将复杂嵌套回调函数转换为简单流程化式的形式完成目标任务。

m0_74157361的博客 1747

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JS ES6 Promise 之 Hello World

■前言最近学习VUE,涉及到了一些内容,都不了解,比如 Axios, Promise,所以,整理记录一下仅仅是一个【 简单 】的介绍,更多的内容,可以看看提供的文章链接,或是其他的资料。0.AxiosAxios,可以理解为ajax i/o system,这不是一种新技术,本质上还是对原生XMLHttpRequest的封装,可用于浏览器和nodejs的HTTP客户端,只不过它是基于Promise的,符合最新的ES规范。

sun0322 5219

ES6 - Promise

Promise是JavaScript中处理异步操作的容器,具有三种状态(pending、fulfilled、rejected),状态一旦改变不可逆转。它通过.then()链式调用处理成功结果,.catch()捕获错误,.finally()执行最终操作。Promise.all()处理多个Promise实例,全部成功才返回结果;Promise.race()则取最先完成的实例结果。Promise.resolve()将对象转为Promise。优点是状态管理清晰,缺点是无法取消、错误需显式捕获。适用于异步流程控制,如

m0_64387122的博客 793

从0开始实现es6 promise类

手动Promise实现主要由基础实现和静态类的实现两部分组成。

qq_33546823的博客 1384

ES6的Promise简单使用

先导解释: ES6是javascript的语言规范,javascript是ES6的实现 解决JS异步代码的组织方式,有单纯的的callback嵌套,js原生的generator,和ES6的Promise,本文以Promise为例 设定场景: 随机[0,1]中的一个数,如果是0则表示失败并结束,如果是1则进行下一步的调用,调用顺序为promise1->promise2->promis

kingliguo的博客 696

详解ES6的Promise

异步操作处理:Promise用于处理需要等待时间较长的操作,如网络请求、文件读取等。通过Promise可以更清晰地表达异步操作的执行顺序和结果处理。状态:Promise有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已失败)。初始状态为pending,当操作成功完成时,状态变为fulfilled,如果发生错误,状态则变为rejected。then()方法:Promise对象的then()方法用于指定操作成功或失败时的回调函数。

rr20060119的博客 1268

es6 中 promise 实现原理

es6中promise 实现原理 以下是学习promise 原理时看到的比较好的版本: 版本一 参考链接:https://github.com/muwoo/blogs /** * index.js * @author monkeywang * Date: 2018/3/5 */ var PENDING = 0; var FULFILLED = 1; var REJECTED = 2; ...

Jacoh的专栏 891

ES6 promise用法以及简单实例

Promise 定义: Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大。它最早由社区提出并实现,ES6将其写进了语言标准,统一了用法,并原生提供了Promise对象。 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息(结果:异步程序是否执行完毕)。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。 语法 new Prom

ZhaoYulin6的博客 552
上一篇: 正则表达式
下一篇: JS和DOM相关的操作
Yvan_Lin
博客等级 码龄10年 11粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值