首页 > 其他分享 >JS promise 原理

JS promise 原理

时间:2022-09-26 12:12:39浏览次数:80  
标签:status resolve self JS promise reject 原理 pending

Promise 对象有三种状态:pendingfullfilled 和 rejected,分别代表了 promise 对象处于等待、执行成功和执行失败状态。

创建 promise 对象后处于pending状态,pending状态可以转化为fullfilledrejected状态,但不能逆向转化,且转化过程只能有一次,即resolvereject后不能再resolvereject。因此需要在 promise 对象中持有状态的引用,通过添加一个名为_state(为了说明是内部属性,用户不要直接使用,属性名前加了下划线,后面同理)的属性实现。现在 Promise 构造函数定义如下

function Promise(resolver) {
    this._status = 'pending';
}
Promise.prototype.then = function(onResolve, onReject) {
    var promise = new Promise(function() {});
    ...
    return promise;
}

 

 

那么如何实现promise呢?先观察一下promise的样子

let  a = new Promise((resolve,reject)=>{
       // dosomething
       resolve()  
})

 

function PromiseFn(callBack){
        let self = this;
        self.resolveVal = undefined;
        self.rejectVal = undefined;
        self.status = 'pending'//默认是等待状态
        
        function resolve(val){
            if(self.status === 'pending'){
                self.resolveVal = val;
                self.status = 'resolve'
            }
        }
        function reject(val){
            if(self.status === 'pending'){
                self.rejectVal = val;
                self.status = 'reject'
            }
        }     //这里要注意,try catch若是写在 let self = this 会报错,let存在暂时死区,没有常规的变量提升。必须先申明后使用     // callback执行,调用resolve函数。
        try{
            callBack(resolve,reject)//callback进来自动执行
        }catch(e){
            reject()//若是有报错,则直接变为reject状态
        }
    }

上面这一步,需要注意的是callback是立即执行的。下面这段会立即打印111

 

let  a = new Promise((resolve,reject)=>{
       console.log('111')
})console.log('456')

上面我们定义了 resolveVal 和 rejectVal,因为待会在promise调用then执行的时候,会作为参数传参给resolveFunticon或者rejectFunction

 

下面一起看看promise.then吧,promise.then(resolveFunticon,rejectFunction)。在promise的原型链上有个then方法

PromiseFn.prototype.then = function(resolveFunction,rejectFunction){
  let self = this;
  if(self.status === 'resolve'){
    resolveFunction(self.resolveVal)
  }
  if(self.status === 'reject'){
    rejectFunction(self.rejectVal)
  }
}

 

 

在then执行的时候,去判断内部是啥状态,然后执行对应的resolve或者reject回调函数

let promiseA = new PromiseFn((resolve,reject)=>{
         resolve('成功啦')
})
promiseA.then((resolveVal)=>{
    console.log('resolve'+resolveVal)
},(rejectVal)=>{
    console.log('reject'+rejectVal)

 

 

参考

 

标签:status,resolve,self,JS,promise,reject,原理,pending
From: https://www.cnblogs.com/mc-congxueda/p/16730437.html

相关文章

  • vue 中使用 富文本编辑器;带图片上传时后台报错JSON parse error: Unexpected characte
    使用的是 wangEditorvue安装好后,在components文件夹下创建一个创建一个类<template><divref="editor"></div></template><script>importEfrom'wange......
  • SOLID 设计原理揭秘
    SOLID设计原理揭秘本文最初发表于https://www.learncsdesign.com坚硬的是五项设计原则的首字母缩写词,旨在使软件设计更易于理解、灵活和可维护。它们是由RobertC......
  • js 变量提升
    a();functiona(){alert('1')}vara=function(){alert('2')}a();//先弹出alert(1),再弹出alert(2)a();vara=function(){alert('2')}functi......
  • HashMap底层原理及jdk1.8源码解读
    一、前言写在前面:小编码字收集资料花了一天的时间整理出来,对你有帮助一键三连走一波哈,谢谢啦!!HashMap在我们日常开发中可谓经常遇到,HashMap源码和底层原理在现在面试中是......
  • Pure JS Coding Challenge01 — 双色球彩票
    PureJSCodingChallenge01—双色球彩票功能说明:双色球由33个红球和16个蓝球组成,一记双色球包括6个不重复的红球和1个蓝球。请阅读给定的页面和代码,完成randomFn函数......
  • 详解JS中 call 方法的实现
    摘要:本文将全面的,详细解析call方法的实现原理本文分享自华为云社区《关于JavaScript中call方法的实现,附带详细解析!》,作者:CoderBin。本文将全面的,详细解析call方法的......
  • react的jsx语法是怎样解析的
    首先我们来看看下面的代码import"react"from"react";constelement=(<div><div><span>1</span><span>2</span>......
  • jsp
     Author:GavinVersion:9.0.2一、引言1.1现有问题二、JSP(JavaServerPages)2.1概念2.2作用三、JSP开发【重点】3.1创建JSP3.1.1JSP编写Java代码3.1.2访问JSP3.2......
  • 并发原理—如何保证多条指令的原子性(二)
    一、提出问题:一条CPU原语指令如何保证多条指令的原子性从上篇文章我们知道当多个CPU访问(此处访问的含义不仅有读取内存数据的意思,同时也有往内存写入数据的意思)同一个数据......
  • tomcat 访问日志转json
    一、安装jdk、tomcatcat install_tomcat.sh #!/bin/bashJDK_FILE="jdk-8u341-linux-x64.tar.gz"#JDK_FILE="jdk-8u281-linux-x64.tar.gz"TOMCAT_FILE="apache-tomc......