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. schedule 定时运行 Python 函数

    安装 pip install schedule 例子 每x分钟运行一次 import schedule import time def job(): print("I'm working.. ...

  2. explain分析

    explain分析字段:id.select_type.type.partitions.type.possible_keys.key.key_len.ref.rows.rows.filtered.ext ...

  3. 【JAVA基础】数值处理

    #BigDecimal处理 ##保留两位小数 https://www.cnblogs.com/jpfss/p/8072379.html /** * 保留两位小数 */ @org.junit.Test ...

  4. signed main 和 int main 的区别

    事实上只是因为有人直接 #define int long long 了...然后int main改成signed main就行了 #define int long long ... signed ma ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (181)-- 算法导论13.4 4题

    四.用go语言,在 RB-DELETE-FIXUP 代码的哪些行中,可能会检查或修改哨兵 T.nil ? 文心一言: RB-DELETE-FIXUP 是红黑树中的一个操作,用于在删除一个节点后进行必要 ...

  6. Serverless 的前世今生

    作者:刘宇(江昱) 从云计算到Serverless架构 大家好,我是阿里云 Serverless 产品经理刘宇,很高兴可以和大家一起探索 Serverless 架构的前世今生. 从云计算到云原生再到 ...

  7. util工具函数

    1 /** 2 * @param {Function} fn 防抖函数 3 * @param {Number} delay 延迟时间 4 */ 5 export function debounce(f ...

  8. 区分开发环境和生产环境webpack

  9. 多倍图切图cutterman

  10. longjmp 使 C++ RAII 失效

    C 语言的 longjmp 没有进行栈展开,而是直接跳转.从 longjmp 到 setjmp 之间的所有析构函数都没有调用,也就是 RAII 失效. #include <setjmp.h> ...