手写promise实现自定义封装多个回调函数的执行
自定义封装多个回调函数的执行
<script src="./Promise.js"></script>
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ok');
}, 1000)
})
p.then(res => {
alert(res)
}, err => {
console.log(err)
})
p.then(res => {
console.log(res)
}, err => {
console.log(err)
})
从上面这一段代码中,我们发现
只出现了console.log()
并没有出现alert()
因为我们出现了覆盖
第二个将第一个覆盖了;
所以我们使用
// 这个是保存回调函数
this.callBack={
onResolve:onResolve,
onReject:onReject
}
这样的保存回调函数是不合适的
我们应该将所有的回调函数保存起来
1==> 将之前声明的对象对象变成一个数组
// 声明属性成为一个数组
this.callBack=[];
2==> 保存回调的时候每一个都进行保存使用push方法
// 这个是保存回调函数
this.callBack.push(
{
onResolve:onResolve,
onReject:onReject
}
)
3==>将成功或者失败后的回调函数进行遍历
// 调用成功的回调函数进行遍历
self.callBack.forEach(item=>{
item.onResolve(data)
})
// 调用失败的回调函数数进行遍历
self.callBack.forEach(item=>{
item.onReject(err)
})
实现自定义封装多个回调函数的执行
function Promise(executor){
const self=this;
function resolve(data){
// 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
if( self.PromiseStatus!=='pending') return
self.PromiseStatus='resolved';
self.PromiseValue=data;
// 调用成功的回调函数进行遍历
self.callBack.forEach(item=>{
item.onResolve(data)
})
}
// 同样声明成为一个函数;修改状态
function reject(err){
// 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
if( self.PromiseStatus!=='pending') return
self.PromiseStatus='rejected';
self.PromiseValue=err;
// 调用失败的回调函数数进行遍历
self.callBack.forEach(item=>{
item.onReject(err)
})
}
this.PromiseStatus ='pending' ;
this.PromiseValue =null;
// 声明属性 new add
this.callBack=[];
// 对异常进行处理;使用try catch
try{
executor(resolve,reject);
}catch(err){
reject(err);
}
}
// 自定义封装then方法执行回调
Promise.prototype.then=function(onResolve,onReject){
//{PromiseStatus:"resolved"PromiseValue:"ok"}
if(this.PromiseStatus==='resolved'){
onResolve(this.PromiseValue)
}
if(this.PromiseStatus==='rejected'){
onReject(this.PromiseValue)
}
// 如果是pending的状态
if(this.PromiseStatus==='pending'){
// 这个是保存回调函数
this.callBack.push(
{
onResolve:onResolve,
onReject:onReject
}
)
}
}
手写promise实现自定义封装多个回调函数的执行的更多相关文章
- 手写Promise中then方法返回的结果或者规律
1. Promise中then()方法返回来的结果或者规律 我们知道 promise 的 then 方法返回来的结果值[result]是由: 它指定的回调函数的结果决定的 2.比如说下面这一段代码 l ...
- 手写Promise A+ 规范
基于ES6语法手写promise A+ 规范,源码实现 class Promise { constructor(excutorCallBack) { this.status = 'pending'; ...
- 手写Promise看着一篇就足够了
目录 概要 博客思路 API的特性与手写源码 构造函数 then catch Promise.resolved Promise.rejected Promise.all Promise.race 概要 ...
- 史上最简单的手写Promise,仅17行代码即可实现Promise链式调用
Promise的使用相比大家已经孰能生巧了,我这里就不赘述了 先说说我写的Promise的问题吧,无法实现宏任务和微任务里的正确执行(也就是在Promise里面写setTimeout,setInter ...
- 手写promise
写在前面: 在目前的前端分开中,我们对于异步方法的使用越来越频繁,那么如果处理异步方法的返回结果,如果优雅的进行异步处理对于一个合格的前端开发者而言就显得尤为重要,其中在面试中被问道最多的就是对Pro ...
- 手写Promise简易版
话不多说,直接上代码 通过ES5的模块化封装,向外暴露一个属性 (function(window){ const PENDING = 'pending'; const RESOLVED = 'fulf ...
- 前端面试题之手写promise
前端面试题之Promise问题 前言 在我们日常开发中会遇到很多异步的情况,比如涉及到 网络请求(ajax,axios等),定时器这些,对于这些异步操作我们如果需要拿到他们操作后的结果,就需要使用到回 ...
- [转]史上最最最详细的手写Promise教程
我们工作中免不了运用promise用来解决异步回调问题.平时用的很多库或者插件都运用了promise 例如axios.fetch等等.但是你知道promise是咋写出来的呢? 别怕-这里有本promi ...
- 手写 Promise
在上一章节中我们了解了 Promise 的一些易错点,在这一章节中,我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写 Promise 也是一道大厂常考题,在 ...
- 手写Promise原理
我的promise能实现什么? 1:解决回调地狱,实现异步 2:可以链式调用,可以嵌套调用 3:有等待态到成功态的方法,有等待态到失败态的方法 4:可以衍生出周边的方法,如Promise.resolv ...
随机推荐
- 云图说|云数据库RDS跨区域备份
摘要:云数据库RDS支持将备份文件存放到另一个区域存储,某一区域的实例故障后,可以在异地区域使用备份文件在异地恢复到新的RDS实例,用来恢复业务. 本文分享自华为云社区<云图说_云数据库RDS- ...
- Seal梁胜:近水楼台先得月,IT人员应充分利用AI解决问题
2023年9月2日,由平台工程技术社区与数澈软件Seal联合举办的⌈AIGC时代下的平台工程⌋--2023平台工程技术大会在北京圆满收官.吸引了近300名平台工程爱好者现场参会,超过3000名观众在线 ...
- Docker cp 将宿主机上的文件复制到容器中
[root@localhost ~]# docker cp /opt/web/docker_cp.txt tomcat9093:/usr/local/apache-tomcat-9.0.31/ [ro ...
- Hyper-V CentOS Linux 硬盘扩容
同一物理盘进行扩容(非挂载),首先在虚机内将硬盘空间扩大, Hyper-V 需要将检查点删除 查看物理卷和卷组,并将物理卷加入到卷组 #将剩余空间添加到逻辑卷 /dev/centos/root lve ...
- 将MyBatis Mapper xml 放到 jar 包外面
在不改程序的情况下,修改 sql 时,需要将 Mapper 中的 XML 文件 放到外面 mybatis: mapper-locations: classpath:mapper/*.xml #J ...
- 基于BaseHTTPRequestHandler的HTTP服务器基础实现
1. BaseHTTPRequestHandler介绍 BaseHTTPRequestHandler是Python中的一个基类,属于http.server模块,用于处理HTTP请求的基本功能.它提供了 ...
- 飞书接入ChatGPT
飞书接入ChatGPT 前天我用飞书接入了GPT-3,现在终于可以在国内畅通地聊天了. 上面是群聊截图,下面是私聊截图 其实实现过程极其简单,但是我和好兄弟确实绕了不少弯路. 首先提醒: 1 不适合个 ...
- FB08、F.80凭证冲销校验增强
1业务场景 当使用FB08和F.80在前台冲销会计凭证时,需要限制三种不同的会计凭证类型,并报消息到相应的程序中处理这三种会计凭证类型. 2技术实现 在BADI和二代中均未找到合适的增强点,因此根据在 ...
- Spring 学习笔记(5)AOP
本文介绍 Spring 中 AOP 的原理及使用方式. Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切 ...
- Codeforce 1335C - Two Teams Composing 统计技能种类数量+统计同一技能最大数量
7 4 2 4 1 4 3 4 统计技能种类数量 4种不同技能 统计同一技能最大数量 技能1(数量1) 技能2(数量1) 技能3(数量1) 技能4(数量4) 选出 技能4(数量4) 作为 第2组 扣除 ...