返回顶部
首页 > 资讯 > 精选 >JavaScript怎么实现简易的Promise对象
  • 206
分享到

JavaScript怎么实现简易的Promise对象

2023-07-04 16:07:27 206人浏览 八月长安
摘要

这篇“javascript怎么实现简易的Promise对象”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript

这篇“javascript怎么实现简易的Promise对象”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript怎么实现简易的Promise对象”文章吧。

前言

实现一个简易的Promise对象,我们首先要了解几个相关的知识点:

Promise对象的状态: pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

Promise的参数: Promise构造函数接收一个函数作为参数,函数内部有两个参数,分别是resolve和reject,这两个参数是两个函数,由js引擎提供,不需要我们部署。reslove函数的作用是将Promise对象的状态由 'pending' 状态变为 'resolved'状态即('fulfilled'状态),方便与参数名对应,reject函数的作用是将Promise对象的状态由 'pending' 状态变为 'rejected'状态。

但是我们应该注意的是,Promise对象的状态一经改变,就不再发生改变(即pending --> resolved || pending --> rejected 其中任意一种发生改变之后,Promise对象的状态将不再发生改变)

Promise的基础结构与用法

 let p1 = new Promise((resolve, reject) => {   resolve('成功');   reject('失败');   throw('报错');  //相当于reject() }) console.log(p1);

让我们看看三种状态的打印的结果分别是什么吧

JavaScript怎么实现简易的Promise对象

JavaScript怎么实现简易的Promise对象

JavaScript怎么实现简易的Promise对象

使用class类实现promise对象

class myPromise {  constructor(executor) {    this.status = 'pending'; // 变更promise的状态    this.value = null;        executor(this.resolve, this.reject); // new 一个myPromise 得到的实例对象里面有两个函数  }  resolve(value) {    if (this.status !== 'pending') return;    this.status = 'fulfilled'; // 变更promise的状态    this.value = value;  }  reject(reason) {    if (this.status !== 'pending') return    this.status = 'rejected';    this.value = reason;  }}

貌似这么写代码逻辑也说得通,那么让我们看一下实现的效果:

JavaScript怎么实现简易的Promise对象

看到这里,不难想到我们的resolve和reject的两个方法的this指向出现了问题,我们仔细看看不难发现,这两个方法被我们作为实参放到了构造器函数,此时this的指向是指向了构造器函数,而不是我们写的myPromise这个构造函数身上,那只需要bind显示绑定一下this 的指向就可以解决了。

executor(this.resolve.bind(this), this.reject.bind(this))

JavaScript怎么实现简易的Promise对象

并且myPromise的状态一经变更也不再改变,是不是有一点原装Promise的味道了。但是在Promise里面还有一个错误捕捉机制,只要promise里面执行的逻辑报错了,就需要走reject逻辑,将错误抛出来,那我们只需要使用try catch来实现就可以。

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

这样我们就实现了极简版的Promise对象,但是通常情况下我们都是使用Promise对象来处理异步的问题,说到异步,那不得不提起Promise.prototype.then()这个方法了,then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。

then方法的第一个参数是`resolved状态的回调函数`,第二个参数是`rejected状态的回调函数`,它们都是可选的。

当promise的状态为'fulfilled'会执行第一个回调函数,当状态为'rejected'时执行第二个回调函数。

必须等到Promise的状态变更过一次之后,状态为'fulfilled'或者'rejected',才去执行then里面的逻辑。

.then支持链式调用,下一次.then受上一次.then执行结果的影响。

知道以上这几点,我们就可以尝试如何实现.then方法了

class myPromise {  constructor(executor) {    this.status = 'pending';     this.value = null;    this.onFulfilledCallbacks = []; // 用来保存成功的回调(处理异步)    this.onRejectedCallbacks = []; // 用来保存失败的回调(处理异步)    try {      executor(this.resolve.bind(this), this.reject.bind(this));    } catch (error) {      this.reject(error)    }  }  resolve(value) {    if (this.status !== 'pending') return;    this.status = 'fulfilled';    this.value = value;    // 调用then里面的回调    while (this.onFulfilledCallbacks.length) { // 当异步成功回调数组中存在回调函数,那就执行      this.onFulfilledCallbacks.shift()(this.value)    }  }  reject(reason) {    if (this.status !== 'pending') return    this.status = 'rejected';    this.value = reason;    while (this.onRejectedCallbacks.length) { // 当异步失败回调数组中存在回调函数,那就执行      this.onRejectedCallbacks.shift()(this.value)    }  }  then(onFulfilled, onRejected) {    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val => val  // 判断.then的第一个参数是不是一个函数,如果不是就直接作为结果返回    onRejected = typeof onRejected === 'function' ? onRejected : val => { throw val } // 判断.then的第二个参数是不是一个函数,如果不是就直接作为错误返回    var thenPromise = new myPromise((resolve, reject) => {  // 因为.then返回的是一个心的Promise对象      const resolvePromise = callback => {  // 用于判断回调函数的类型        setTimeout(() => {   // 让整个回调函数比同步代码晚一点执行,官方不是使用setTimeout实现          try {            const x = callback(this.value);            if (x === thenPromise) {  // 你正在返回自身              throw new Error('不允许返回自身!');            }            if (x instanceof myPromise) { // 返回的是一个Promise对象              x.then(resolve, reject);            } else { // 直接返回一个值,作为resolve的值,传递给下一个.then              resolve(x);            }          } catch (error) {            reject(error);            throw new Error(error)          }        })      }      if (this.status === 'fulfilled') {        resolvePromise(onFulfilled)      } else if (this.status === 'rejected') {        resolvePromise(onRejected)      } else if (this.status === 'pending') {        this.onFulfilledCallbacks.push(resolvePromise.bind(this, onFulfilled));        this.onRejectedCallbacks.push(resolvePromise.bind(this, onRejected));      }    })    return thenPromise  }}

JavaScript怎么实现简易的Promise对象

以上就是关于“JavaScript怎么实现简易的Promise对象”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: JavaScript怎么实现简易的Promise对象

本文链接: https://lsjlt.com/news/346530.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript怎么实现简易的Promise对象
    这篇“JavaScript怎么实现简易的Promise对象”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript...
    99+
    2023-07-04
  • JavaScript的Promise对象怎么用
    这篇文章主要讲解了“JavaScript的Promise对象怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的Promise对象怎么...
    99+
    2024-04-02
  • 如何实现一个简易promise
    这篇文章主要介绍如何实现一个简易promise,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!step1 搭建框架 首先我们需要在这里放置一个promise函数本体 后面要在里面添加resolve、reject的执行函...
    99+
    2023-06-25
  • 教你一步步实现一个简易promise
    目录step1 搭建框架step2 填充搭建好了的Promise框架总结step1 搭建框架 1. 首先我们需要在这里放置一个promise函数本体 后面要在里面添加resolve、...
    99+
    2024-04-02
  • JavaScript怎么实现手写promise
    这篇文章主要介绍了JavaScript怎么实现手写promise的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript怎么实现手写promise文章都会有所收获,下面我们一起来看看吧。需求我们先来总...
    99+
    2023-07-06
  • 怎么理解ES6 Promise对象
    这篇文章主要讲解了“怎么理解ES6 Promise对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解ES6 Promise对象”吧!概述是异步编程的...
    99+
    2024-04-02
  • JavaScript实现简易购物车最全代码解析(ES6面向对象)
    本文实例为大家分享了JavaScript实现简易购物车的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html> &...
    99+
    2024-04-02
  • JavaScript实现简易轮播图最全代码解析(ES6面向对象)
    本文实例为大家分享了JavaScript实现简易轮播图的具体代码,供大家参考,具体内容如下 完整代码: <!DOCTYPE html> <html> &...
    99+
    2024-04-02
  • nodejs中简单实现Javascript Promise机制的实例
    promise/deferred 是一个很好的处理异步调用编码的规范,下面以nodejs代码为类,来实现一个promise/A 规范的简单实现 var EventEmitter = require('...
    99+
    2022-06-04
    实例 机制 简单
  • javascript怎么实现简易的计算器功能
    本篇内容介绍了“javascript怎么实现简易的计算器功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!javascript实现简易计算器...
    99+
    2023-06-29
  • Javascript实现简易导航栏
    本文实例为大家分享了Javascript实现简易导航栏的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en">...
    99+
    2024-04-02
  • javascript中的糖衣语法Promise对象详解
    目录一、Promise的诞生1、回调地狱二、Promise的行为1、Promise的语法2、Promise的方法(1)Promise.prototype.then()(2)Promi...
    99+
    2024-04-02
  • ES6中怎么使用Promise对象
    这期内容当中小编将会给大家带来有关ES6中怎么使用Promise对象,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在promise之前处理异步回调的方式function&...
    99+
    2024-04-02
  • 怎么用python实现简易聊天对话框
    本篇内容介绍了“怎么用python实现简易聊天对话框”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果图: 客户端代码: ...
    99+
    2023-06-29
  • javascript对象的增删改查怎么实现
    小编给大家分享一下javascript对象的增删改查怎么实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是对象?嘿!这还用问吗?对象不就是“你的女朋友” 嘛!,或许你以为我在胡说,但事实上确实就是。看完下面这个定义,...
    99+
    2023-06-29
  • JavaScript面向对象的支持怎么实现
    本篇内容介绍了“JavaScript面向对象的支持怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在JavaScript中,我们需要通...
    99+
    2023-06-03
  • JavaScript实现简易飞机大战
    本文实例为大家分享了JavaScript实现简易飞机大战的具体代码,供大家参考,具体内容如下 话不多说,直接上代码 <!DOCTYPE html> <html la...
    99+
    2024-04-02
  • Promise对象怎么在Nodejs中使用
    这期内容当中小编将会给大家带来有关Promise对象怎么在Nodejs中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Promise对象1. promise用来做什么?我们的需求是一次的去执行异步代码...
    99+
    2023-06-14
  • javascript实现简易的计算器功能
    本文实例为大家分享了javascript实现简易的计算器的具体代码,供大家参考,具体内容如下 javascript实现简易计算器,只有两个input输入框,简单实现加减乘除: <...
    99+
    2024-04-02
  • JavaScript排序对象数组怎么实现
    这篇文章主要介绍“JavaScript排序对象数组怎么实现”,在日常操作中,相信很多人在JavaScript排序对象数组怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作