首页 > 编程语言 >promise源码加分析

promise源码加分析

时间:2023-11-20 13:22:55浏览次数:110  
标签:分析 异步 resolve 这个 源码 promise sql 执行

class Promise {
  queue1 = [] // queue1 为了容纳成功之后的函数们
  queue2 = [] // queue2 为了容纳失败之后的函数们
  constructor(fn){ // new Promise(fn)
    const resolve = (data)=>{ // fn 接受 resolve 并在成功的时候调用
      setTimeout(()=>{ // 要等一会,否则 queue1 和 queue2 为空
        for(let i =0;i<this.queue1.length;i++){
          this.queue1[i](data)
        }
      })
    }
    const reject = (reason)=>{
      setTimeout(()=>{
      for(let i =0;i<this.queue2.length;i++){
          this.queue2[i](reason)
        }
      })
    }
    fn(resolve, reject)
  }
  then(s, e){
    this.queue1.push(s)
    this.queue2.push(e)
    return this
  }
}
p1 = new Promise((resolve, reject)=>{
  console.log('hi2'); 
  if(Math.random()>0.5){
    resolve('大')
  }else{
    reject('小')
  }
})
p1.then((data)=>{console.log('成功')},  (reason)=>{console.log('失败')})

首先请先理解上面这段手写的promise,一定要先理解,不然下面的会看不懂

好,我就看到这篇文章的读者理解了,下面看是讲讲我对这个的看法和promise的一些用处
首先:在js文件执行的时候这个class会被初始化,然后到下面的这个new关键字出现,这个时候这个类首先会执行,然后他用的这个then方法也会被定义出来,
之后会执行这个类的constructor函数,在执行的时候,他给传入的这个箭头函数,也就是

(resolve, reject)=>{
  console.log('hi2'); 
  if(Math.random()>0.5){
    resolve('大')
  }else{
    reject('小')
  }
}

这个函数的两个参数定义成为了两个函数,这个地方,一定一定要看到setTimeout这个定时器,这个是promise的精髓.
为啥说这个setTimeout是精髓,因为他是异步的,开启定时器那么就会放入到异步队列中,下一步就会执行同步代码了,也就是说下文的p1.then()方法将在下一步执行
.then()方法执行的时候,传递了两个参数到queue1 和queue2 这两个队列中
这就好比,我现在准备开始吃饭了,那么下一步是不是需要先准备一个碗盛东西,嘿嘿,那么这个碗就是.then()方法提供的,等同步代码全部执行完毕就开始执行异步队列中的逻辑了
也就是给了你碗了现在可以开吃了,那么就会将这个.then里面传入的回调函数进行执行.

我研究这个主要是在使用nodejs 的时候需要使用sql进行数据处理,然后sql为异步,异步就算了,可这是个使用forEach开启很多个的异步,我想在这个forEach执行完毕之后也就是所有sql执行完毕之后
再进行res.send()操作,显然直接写在sql中是不行了. 然后我看到之前笔记里面的手写promise,得到了新的理解,直接在promise中使用forEach,当然外面需要嵌套tryCatch,因为只要有一个sql出错
那么就需要停止forEach,等到最后执行完毕之后. 嘿嘿,到这里有没有人会想到,这不还是直接开了很多异步,你下面加一个判断每次都会先执行,到了最后一次的时候,没准最后一次的sql还没执行完毕呢!
嘿嘿,这么想是正确的,所以我在最后的判断开了一个宏任务,也就是定时器.这样sql语句的每一次执行都被推送一个异步执行队列中,先进先出.到最后定时器一定会在队列的最后面执行.等执行完毕之后,
就会执行.then()中第一个函数中内容,这样这个需求就被完美满足


最后我想说的是promise不仅是用来解决回掉地狱,我上面说的这种多个异步同时执行,需要在这多个异步都有一个结果之后才能执行的一些逻辑 这样的需求面前,就能使用promise满足需求.
然后promise的原理其实就是: 1.没有.then()方法,那么调用resolve或reject都没啥效果. 2.调用resolve或者reject之前一切都是同步的,调用之后会开启一个异步宏任务,让.then()方法将回调函数
准备好,等所有同步任务执行完毕之后才会执行.then()的回调

标签:分析,异步,resolve,这个,源码,promise,sql,执行
From: https://www.cnblogs.com/yourgrandfather/p/17843720.html

相关文章

  • 数据分析师如何做好PPT
    作为一名数据分析师,制作出色的PPT是非常重要的技能之一。一个好的PPT可以让你的数据洞察更加生动有趣,并有效传达给观众。以下是一些详细的步骤和技巧,帮助你成为一名擅长制作PPT的数据分析师:确定目标和受众:在开始设计PPT之前,明确你的目标和受众是非常重要的。了解你的受众是谁,他们......
  • Avalonia 实现跨平台的IM即时通讯、语音视频通话(源码,支持信创国产OS,统信、银河麒麟)
       在Avalonia如火如荼的现在,之前使用CPF实现的简单IM,非常有必要基于Avalonia来实现了。Avalonia在跨平台上的表现非常出色,对信创国产操作系统(像银河麒麟、统信UOS、Deepin等)也很不错。   现在,我们就来使用Avalonia实现一个跨平台的简单IM,除了文字聊天外,还可......
  • Netty源码学习4——服务端是处理新连接的&netty的reactor模式
    系列文章目录和关于我零丶引入在前面的源码学习中,梳理了服务端的启动,以及NioEventLoop事件循环的工作流程,并了解了Netty处理网络io重要的Channel,ChannelHandler,ChannelPipeline。这一篇将学习服务端是如何构建新的连接。一丶网络包接收流程当客户端发送的网络数据帧通过网......
  • 富力地产公司财务风险分析与应对措施—文档
    房地产行业具有资金密集、政策导向性强、整体开发周期长、资金需求量大等特点,所以与其他行业相比,它更容易产生财务风险。近几年,随着国家多次重申“房住不炒”的方针,各地纷纷出台了一系列调控措施,特别是2018年,随着房价的持续攀升,各地纷纷出台了一系列的限价、限购措施,加之银行贷款利......
  • 拼多多订单生成器手机版,支持淘宝京东截图生成,E4A源码,仅供娱乐学习
    闲着用E4A对接了JAVA类库制作了一个订单生成器,当然我叫了水印,这个软件或者里面的截图做不了啥坏事,仅仅用来学习娱乐装逼用的,下面是框架和代码。框架图1:  框架图2:  JAVa代码库:======================================================//商品类classProduct{St......
  • IO_leak学习以及相关题目分析
    学习于:关于IOleak的学习总结|ZIKH26'sBlog 一,前置背景知识:当开启了FULLRELRO保护,以及没有show等函数的时候,我们可以通过篡改_IO_2_1_stdout_结构体中_IO_write_base和flags等来绕过源码中的检查(可以去搜索一下看看更好理解),当程序遇到puts函数的时候,使得我们可以......
  • 前端学习笔记202308学习笔记第七十六天-webpack源码分析2
       ......
  • 前端学习笔记202308学习笔记第七十六天-webpack源码分析1
        ......
  • 解密Prompt系列19. LLM Agent之数据分析领域的应用:Data-Copilot & InsightPilot
    在之前的LLMAgent+DB的章节我们已经谈论过如何使用大模型接入数据库并获取数据,这一章我们聊聊大模型代理在数据分析领域的应用。数据分析主要是指在获取数据之后的数据清洗,数据处理,数据建模,数据洞察和数据可视化的步骤。可以为经常和数据打交道,但是并不需要太过艰深的数据分析......
  • 数据分享|spss modeler用贝叶斯网络分析糯稻品种影响因素数据可视化
    全文链接:https://tecdat.cn/?p=34271原文出处:拓端数据部落公众号在农业科学领域,对糯稻品种的研究一直备受关注。糯稻作为一种重要的粮食作物,其产量和质量均对农业生产具有深远的影响。然而,影响糯稻品种的因素是多元化的,理解这些因素之间的关系以及如何通过数据可视化来呈现这些......