promise学习1-promise特点,手写简易版promise

这篇具有很好参考价值的文章主要介绍了promise学习1-promise特点,手写简易版promise。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.promise特点

1.promise有三个状态 成功态(resolve) 失败态(reject) 等待态(pending)(既不成功也不失败)
举个例子,女友叫你给她买包 买 不买 不说话
promise就是一个类,所以要new。promise默认为pending状态。
2.用户自己决定成功和失败的原因,也决定最后是否成功还是失败

 let promise =  new Promise((resolve, reject) => {
//意思就是这里可以写业务代码,自己决定什么情况是失败什么是成功
 })
 console.log(promise)

3.promise默认执行器立即执行 !!!

let promise =  new Promise((resolve, reject) => {
console.log(1)
})
console.log(2)
//结果是1,2 

4.Promise的实例都有一个then方法,一个参数是成功的回调,一个是失败的回调

let promise = new Promise((resolve, reject) => {
   console.log(1)
   // resolve('成功')
})
promise.then((data) => {
   console.log('success', data)
}, (err) => {
   console.log('fail', err)
})
//结果 1

这里既没有抛出成功也没有抛出失败,所以不会执行后面的相关回调。
5.如果执行函数是发生了异常也会执行错误的逻辑

let promise = new Promise((resolve, reject) => {
  throw new Error('失败了');
})
promise.then((data) => {
   console.log('success', data)
}, (err) => {
   console.log('fail', err)
})
//结果 : fail 失败了

6.promise一旦成功了就不能失败了,一旦失败了就不能成功了

2.手写promise

根据上面的特点手写promise

2.1简单的promise


const RESOLVE = 'RESOLVE';
const REJECT = 'REJECT';
const PENDING = 'PENDING';
class Promise {
   constructor(executor) {
      this.status = PENDING;
      this.value = undefined;
      this.reason = undefined;
      //resolve和reject不属于实例上的
      let resolve = (value) => {
         if (this.status === PENDING) {
            this.value = value;
            this.status = RESOLVE;
         }
      }
      let reject = (reason) => {
         if (this.status === PENDING) {
            this.reason = reason;
            this.status = REJECT;
         }
      }
      try {
         executor(resolve, reject); //立即执行并传入resolve和reject
      } catch (error) {
         //错误处理 就直接走错误逻辑
         reject(error);
      }
   }
   then(onFufilled, onRejected) {
      if (this.status === RESOLVE) {
         onFufilled(this.value)
      }
      if (this.status === REJECT) {
         onRejected(this.reason)
      }
   }
}

2.2promise的then方法

但是上面的then方法是有缺陷的,处理有异步的方法是有问题的,例如执行下面的代码就会出问题

let Promise = require('./promise')
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
     resolve(1)
}, 1000);
})
promise.then((data) => {
   console.log('success', data)
}, (err) => {
   console.log('fail', err)
})

代码执行的结果是什么都不会打印出来的
因为then方法里刚开始的状态是pending,但是之前的代码中是没有对状态为pending的进行处理的,所以是不会有什么逻辑走的,而且1秒过后状态变为resolve,但是又不会再执行方法了的。
所以我们需要做的就是第一,把pending状态的进行区分;第二,等转换为resolve或则reject状态的话还能在执行then方法。
第二种我们要使用发布订阅模式。
将上述代码改造:文章来源地址https://www.toymoban.com/news/detail-552142.html

const RESOLVE = 'RESOLVE';
const REJECT = 'REJECT';
const PENDING = 'PENDING';
class Promise {
   constructor(executor) {
      this.status = PENDING;
      this.value = undefined;
      this.reason = undefined;
      this.onResolvedCallbacks = []; //用来存放成功的回调
      this.onREjectedCallbacks = []; //用来存放失败的回调

      //resolve和reject不属于实例上的
      let resolve = (value) => {
         if (this.status === PENDING) {
            this.value = value;
            this.status = RESOLVE;
            this.onResolvedCallbacks.forEach(fn => fn())
         }
      }
      let reject = (reason) => {
         if (this.status === PENDING) {
            this.reason = reason;
            this.status = REJECT;
            this.onREjectedCallbacks.forEach(fn => fn())
         }
      }
      try {
         executor(resolve, reject); //立即执行并传入resolve和reject
      } catch (error) {
         //错误处理 就直接走错误逻辑
         reject(error);
      }
   }
   then(onFufilled, onRejected) {
      if (this.status === RESOLVE) {
         onFufilled(this.value)
      }
      if (this.status === REJECT) {
         onRejected(this.reason)
      }
      if(this.status === PENDING){
         this.onResolvedCallbacks.push(() =>{
            onFufilled(this.value)
         })
         this.onREjectedCallbacks.push(() =>{
            onRejected(this.reason)
         })
         console.log('等待')
      }
   }
}

module.exports = Promise

到了这里,关于promise学习1-promise特点,手写简易版promise的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [JavaScript理论学习] 什么是Promise (含如何判断一个值是Promise)

    本文旨在对 Promise 的规范进行解释, 便于读者在学习 Promise 的过程中梳理 Promise 之间的操作关系, 不对具体的代码实现和Promise用法进行解释. 比如, 为什么 [MDN-await] 中要提及一个 thenable 对象, 而且这个 thenable 对象 还可以和 Promise 实例 一样使用 await 等待处理, 这就涉及到了下面

    2024年02月09日
    浏览(42)
  • 深入学习JavaScript系列(七)——Promise async/await generator

    本篇属于本系列第七篇 第一篇:#深入学习JavaScript系列(一)—— ES6中的JS执行上下文 第二篇:# 深入学习JavaScript系列(二)——作用域和作用域链 第三篇:# 深入学习JavaScript系列(三)——this 第四篇:# 深入学习JavaScript系列(四)——JS闭包 第五篇:# 深入学习JavaScrip

    2023年04月08日
    浏览(47)
  • 【手写promise——基本功能、链式调用、promise.all、promise.race】

    关于动机,无论是在工作还是面试中,都会遇到Promise的相关使用和原理,手写Promise也有助于学习设计模式以及代码设计。 本文主要介绍了如何使用自己的代码去实现Promise的一些功能。 以下是本篇文章正文内容 手写之前,需要知道promise有哪些基本特性: 1、promise有三种状态

    2024年02月11日
    浏览(34)
  • 手写Promise的基本实现 (超详细)

    目录 一:首先分析官方的promise 二:手写Promise-then方法设计 三:then方法优化: 四:Promise-catch方法设计  五:Promise-finally方法设计 //本文带大家实现一个基本的 promise 过多的边界情况就不在考虐,理解主要实现过程以及逻辑即可 //对于一个个出现的问题 我会逐步分析原因以及

    2024年02月16日
    浏览(38)
  • 手写简易操作系统(十七)--编写键盘驱动

    上一节我们实现了锁与信号量,这一节我们就可以实现键盘驱动了,访问键盘输入的数据也属于临界区资源,所以需要锁的存在。 之前的 ps/2 键盘使用的是中断驱动的,在当时,按下键盘就会触发中断,引导操作系统去处理这个按键行文。但是当今的usb键盘,使用的是轮询机

    2024年04月26日
    浏览(41)
  • 【Spring专题】手写简易Spring容器过程分析

    首先必须得声明的是,下面的流程并不代表Spring源码中真正的流程。而是,我们通过现在的Spring提供给我们的某些基础功能,反推过来的流程。所以,并不全面,但是会具有一点参考性。 由于Spring源码分析是一个前后联系比较强的过程,而且这边分析,也是按照代码顺序讲解

    2024年02月13日
    浏览(40)
  • 深入理解 JavaScript Promise

    JavaScript中的Promise是一种处理异步操作的机制,它提供了一种优雅的方式来处理回调函数地狱和异步代码的流程控制。本文将深入介绍JavaScript中的Promise,帮助读者更好地理解和应用Promise。 Promise是一个代表异步操作的对象,它可以有三种状态:pending(进行中)、fulfilled(已

    2024年02月09日
    浏览(65)
  • JavaScript 之 promise

    封装和调用不是同一个人,不清楚如何调用 设计者不好设计,调用者调用很麻烦 从一个实际的例子来作为切入点: 调用一个函数,这个函数中发送网络请求(可以用定时器来模拟) 如果发送网络请求成功了,那么告知调用者发送成功,并且将相关数据返回过去 如果发送网

    2024年01月21日
    浏览(44)
  • JavaScript Promise

    JavaScript Promise 是一种用于处理异步操作的对象。它表示一个异步操作的最终完成或失败,并且可以处理操作的结果或错误。 Promise 对象有三种状态: 1. Pending(进行中):初始状态,表示操作正在进行中,既不是成功也不是失败。 2. Fulfilled(已完成):表示操作成功完成,并

    2024年02月06日
    浏览(38)
  • JavaScript如何解决返回[object Promise]

    当使用JavaScript中的Promise时,当您尝试访问Promise的值时,您可能会看到返回值为 [object Promise] 的情况。这是因为Promise是一种异步操作,它不能立即返回结果,而是需要等待操作完成后返回结果。 要访问Promise的值,您需要使用Promise的then()方法,该方法接受一个回调函数作为参

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包