手写一个Promise完成resolve 和 reject状态的改变和修改属性

简介: 手写一个Promise完成resolve 和 reject状态的改变和修改属性

1.手写 Promise


1 创建一个文件 Promise.js;内容


function Promise(){
}


2 引入 Promise.js 这个文件


<script src="./Promise.js"></script>
<script type="text/javascript">
    let p = new Promise((resolve, reject) => {
        resolve('ok')
    })
    p.then(res => {
        console.log(res)
    }, err => {
    })
</script>


你会发现上面这个文件会报错,报错的原因是因为:


你引入了这个 Promise.js文件;并且里面的函数是Promise;


它覆盖了全局的Promise;这个是原因1;


还有一个原因是 Promise.js文件中的的函数是Promise;


没有then方法;如果给Promise添加一个then方法,那么就不会报错的哈


3. Promise.js 文件;变为如下


function Promise(){
}
Promise.prototype.then=function(){
}


4.自定义 resolve 和 reject 这样的结构


Promise.js 文件;变为如下


function Promise(executor){
   // 声明成为一个函数,要接受一个形参;因为传递过来的时候有参数
   function resolve(data){
   }
   // 同样声明成为一个函数
   function reject(err){
   }
    // executor会拿到resolve, reject传递过来的函数
    // resolve和reject因为在传递过来的是一个函数,所以在声明的时候,也应该是一个函数哈~
    // 执行器函数在内部是同步调用的
    executor(resolve,reject);
}
Promise.prototype.then=function(onResolve,onReject){
}


5.实现 resolve 和 reject


function Promise(executor){
   function resolve(data){
      //resolve函数主要有两个作用
      // 1 修改对象的状态,Promise;
      // 这个状态是【PromiseStatus】是Promise的一个属性;不同的版本可能是不一样的
      this.PromiseStatus='resolved';//修改Promise的状态为成功
      // 2设置对象的结果;【PromiseValue】是【PromiseStatus】是一个属性;同的版本可能是不一样的
      this.PromiseValue=data;//设置结果
    }
    // 同样声明成为一个函数
    function reject(err){
    }
    // 给Promise添加一个属性pending;
    this.PromiseStatus ='pending' ;
    this.PromiseValue =null;
    executor(resolve,reject);
}
Promise.prototype.then=function(onResolve,onReject){
}


6. 你可能会遇见的坑


1==>当你在控制台输出的时候,你会发现


状态没有发生改变


PromiseStatus=“pending”


PromiseValue=null;


那是因为你的this指向发生了改变


2==>executor不要放在最前面;


executor(resolve,reject);


const self=this;


这样会出问题的哈~


因为 executor(resolve,reject);的时候;会去掉用resolve和reject这两个函数


而resolve函数中此时还没有self;


所以会报错sel出现undefined


7.出坑


function Promise(executor){
    const self=this;
    function resolve(data){
        //resolve函数主要有两个作用
        // 1 修改对象的状态,Promise;
        // 这个状态是【PromiseStatus】是Promise的一个属性;不同的版本可能是不一样的
        // this.PromiseStatus='resolved';//修改Promise的状态为成功 X
        self.PromiseStatus='resolved';
        // 2设置对象的结果;【PromiseValue】是【PromiseStatus】是一个属性;同的版本可能是不一样的
        // this.PromiseValue=data;//设置结果 x
        self.PromiseValue=data;
        // console.log(this);//你会发现这个this是window
    }
    // 同样声明成为一个函数;修改状态
    function reject(err){
        self.PromiseStatus='rejected';
        self.PromiseValue=err;
    }
    // 给Promise添加一个属性pending;
    this.PromiseStatus ='pending' ;
    this.PromiseValue =null;
    executor(resolve,reject);//这个放在后面;它回去调用resolve和reject函数
}
 Promise.prototype.then=function(onResolve,onReject){
  }


相关文章
|
前端开发
promise的resolve,reject,all方法
promise的resolve,reject,all方法
184 0
|
7月前
|
前端开发
promise中reject和catch处理上有什么区别
promise中reject和catch处理上有什么区别
79 0
|
监控 前端开发
Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?
Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?
|
前端开发
使用Promise过程中resolve或reject后,后面代码还会执行
在日常开发中会用到Promise语法,里面有resolve和reject
2054 0
|
前端开发
改变promise状态有三种resolve、reject、throw
改变promise状态有三种resolve、reject、throw
|
前端开发
Promise源码解密-catch/resolve/reject/race
Promise源码解密-catch/resolve/reject/race
|
1月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
22 1
|
1月前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
35 4
|
1月前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。
|
4天前
|
前端开发 JavaScript 开发者
JavaScript进阶-Promise与异步编程
【6月更文挑战第20天】JavaScript的Promise简化了异步操作,从ES6开始成为标准。Promise有三种状态:pending、fulfilled和rejected。基本用法涉及构造函数和`.then`处理结果,如: ```javascript new Promise((resolve, reject) =&gt; { setTimeout(resolve, 2000, &#39;成功&#39;); }).then(console.log); // 输出: 成功