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状态的改变和修改属性的更多相关文章

  1. 手写一个Promise/A+,完美通过官方872个测试用例

    前段时间我用两篇文章深入讲解了异步的概念和Event Loop的底层原理,然后还讲了一种自己实现异步的发布订阅模式: setTimeout和setImmediate到底谁先执行,本文让你彻底理解Eve ...

  2. 【原】手写一个promise

    上一篇文章中,我们介绍了Promise的基本使用,在这篇文章中,我们试着自己来写一个Promise,主要是学习Promise的内部机制,学习它的编程思想. !!!备注:本文写的不好,仅供自己学习之用, ...

  3. 掘金转载-手写一个Promise

    目录 一 什么是Promise ? 二 Promises/A+ 规范 2.1 术语 2.2 基本要求 2.2.1. Promise的状态 2.2.2. Then 方法 2.3 简易版实践 2.4 进一 ...

  4. 面试----你可以手写一个promise吗

    参考:https://www.jianshu.com/p/473cd754311f <!DOCTYPE html> <html> <head> <meta c ...

  5. 手写一个promise

    Promise A+ 规范:https://promisesaplus.com/ 注:以下代码没有通过 promises-aplus-tests 的全部测试,但基本功能还是全的( 测试结果: 864 ...

  6. 只会用就out了,手写一个符合规范的Promise

    Promise是什么 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Prom ...

  7. 如果一个promise永不resolve,会内存泄漏吗

    答:跟内存泄漏没有直接关系gc的策略不会改变,如果该promise没有被人引用,就会被gc掉.如果仍被引用,就不会被gc掉.即使一个promise,resolve或者reject了,但是它还被人引用, ...

  8. Javascript之我也来手写一下Promise

    Promise太重要了,可以说是改变了JavaScript开发体验重要内容之一.而Promise也可以说是现代Javascript中极为重要的核心概念,所以理解Promise/A+规范,理解Promi ...

  9. 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

    摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...

  10. 『练手』手写一个独立Json算法 JsonHelper

    背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...

随机推荐

  1. python支付宝支付

    支付宝开放平台: https://open.alipay.com/platform/home.htm 支付宝沙箱环境: https://openhome.alipay.com/platform/app ...

  2. Spring Cloud整体架构解析

    Spring Cloud整体架构 Spring Cloud的中文名我们就暂且称呼它为"春云"吧,听上去是多么朴实无华的名字,不过呢一般名字起的低调的都是厉害角色,我们就看看Spri ...

  3. 火爆全网的条形竞赛图,Python轻松实现

    这个动图叫条形竞赛图,非常适合制作随时间变动的数据. 我已经用streamlit+bar_chart_race实现了,然后白嫖了heroku的服务器,大家通过下面的网址上传csv格式的表格就可以轻松制 ...

  4. 判断客户端是PC还是移动端问题的解决方案

    今天在帮 莲的Live 2D 做浏览器适配的时候学会的一段代码 利用 Javascript 进行判断 function isPC() { //是否为PC端 var userAgentInfo = na ...

  5. 写SAE评测,获 Airpods 2大奖【集结令】!

    Serverless 应用引擎 SAE 开启测评有奖!名额有限,先到先得! Serverless应用引擎SAE是一款极简易用.自适应弹性的容器化应用平台.现面向所有用户发出诚挚邀请,参与一分钟部署在线 ...

  6. 你折腾一天都装不上的插件,函数计算部署 Stable Diffusion 都内置了

    在进行函数计算 Stable Diffusion 答疑的过程中,遇到很多同学在装一些插件的过程中遇到了难题,有一些需要安装一些依赖,有一些需要写一些代码,很多时候安装一个插件就能折腾几天,我们收集了很 ...

  7. Nginx(2)---搭建一个静态web服务

    1.配置文件语法及参数说明:nginx.conf worker_processes 1; #工作进程多少个 events { worker_connections 1024; #连接数 } http ...

  8. IDE暗黑主题推荐-Dracula

    作为程序员,我们一天中会花费大量时间在编码和阅读代码上.优秀的代码编辑器主题可以减轻眼睛的疲劳,提高工作效率.本文向大家推荐一款非常流行的 JetBrains IDE 主题插件 - Dracula.它 ...

  9. 容器网络原理分析:veth 和 network namespace

    1. Liunx veth-pair 和 network namespace Docker 中容器的访问需要依赖 veth-pair 和 network namespace 等技术.network n ...

  10. cs 保研经验贴 | 数学试题 · 自动化所特供版

    据(2022 年我所看的)往年经验,自动化所比较重视数学. 感觉,按照自动化所的数学题库复习,就足以应付大多数夏令营的笔试面试了. 目录 高等数学 线性代数 概率论 机器学习 复变函数 其他 同站相关 ...