史上最简单的手写Promise,仅17行代码即可实现Promise链式调用
Promise的使用相比大家已经孰能生巧了,我这里就不赘述了
先说说我写的Promise的问题吧,无法实现宏任务和微任务里的正确执行(也就是在Promise里面写setTimeout,setInterval的话,输出顺序会有问题),其他的API(catch、finally、race、all)有兴趣的话,大家可以斟酌补充。
开始贴代码:
// 定义一个Promise类
function Promise(fn){
// 回调队列 存放的所有的.then里面的回调
this.callbacks = [];
// resolve(val)后 真正被执行的代码
let resolve = (val) => {
// resolve 调用是异步的(微任务)
setTimeout(()=>{
// 从回调队列的头部拿一个回调方法
let callback = this.callbacks.shift();
// 执行回调方法并获取返回值 pms
let pms = callback.call(this,val)
// 容错处理 如果pms有值 再赋值
if(pms){
// 将回调队列赋值给下一个promise
pms.callbacks = this.callbacks;
}
}, 0)
}
// fn是初始化promise传入的 执行函数 是同步执行的 传入我们的resolve函数
fn.call(this,resolve)
}
// 实现then方法
Promise.prototype.then =function(cb){
//将回调函数放至回调队列里
this.callbacks.push(cb);
// return this 实现链式调用
return this;
}
测试代码
new Promise ((resolve,reject)=>{
console.log(1)
resolve(3);
}).then(val=>{
console.log(val)
return new Promise ((resolve,reject)=>{
resolve(4)
})
}).then(val=>{
console.log(val)
return new Promise((resolve,reject) => {
resolve(5)
})
}).then(val=>{
console.log(val)
})
console.log(2)
史上最简单的手写Promise,仅17行代码即可实现Promise链式调用的更多相关文章
- 手写笔记变PDF-几行代码变命令行程序为图形化界面
前言 最近发现了一个非常不错的Python类库----Gooey, https://github.com/chriskiehl/Gooey 在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形 ...
- 史上最简单的 SpringCloud 教程 | 终章
https://blog.csdn.net/forezp/article/details/70148833转载请标明出处:http://blog.csdn.net/forezp/article/det ...
- 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
转载请标明出处: 原文首发于 https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f10-eureka/ 本文出自方志朋的博客 文章 史上最简单 ...
- 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)
转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc03-feign/ 本文出自方志朋的博客 最新Finchley版本请访问: ...
- python中实现格式化输入(史上最简单、最高效的实现方法,不借助任何模块)
今天我在写python作业时突然想到格式化输入一段文字,譬如只需读取输入的前几个字符就行,而不幸的是,python中的输入并没有c中的read().getchar()函数,于是我网上搜了一下,网上的解 ...
- 史上最简单的排序算法?看起来却满是bug
大家好,我是雨乐. 今天在搜论文的时候,偶然发现一篇文章,名为<Is this the simplest (and most surprising) sorting algorithm ever ...
- 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。
重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- 史上最简单的 SpringCloud 教程
史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)史上最简单的Spri ...
随机推荐
- Windows用cmd编译运行C程序
在Windows环境下用命令行编译运行程序 浙江大学-C语言程序设计进阶 配置gcc 准备一个Dev-cpp 找到gcc.exe所在目录 Dev-Cpp\MinGW64\bin 地址栏右键将地址复制为 ...
- MIPS指令 MIPS架构
华中科技大学 - 计算机组成原理 华中科技大学 - 计算机硬件系统设计 Microprocessor without Interlocked Pipleline Stages 无内部互锁流水级的微处理 ...
- DPARAM
中M_电子科技大学_计算机组成原理 双端口RAM Dual Port Access RAM 存储器不断接受CPU访问,还要频繁地和I/O设备通信.如果只有一套MAR,ID,MDR和读写电路.任一时刻只 ...
- 【UE4 C++】Input 输入事件绑定
轴映射与动作映射 编辑器设置input+代码实现具体动作 void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInp ...
- Python绘制Excel图表
今天讲解下如何使用Python绘制各种Excel图表,下面我们以绘制饼状图.柱状图.水平图.气泡图.2D面积图.3D面积图为例来说明. import openpyxlfrom openpyxl imp ...
- 面试题 08.12. N皇后
题目 设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角 ...
- 第31篇-方法调用指令之invokevirtual
invokevirtual字节码指令的模板定义如下: def(Bytecodes::_invokevirtual , ubcp|disp|clvm|____, vtos, vtos, invokevi ...
- RSA加密——前端JSEncrypt
RSA加密--前端JSEncrypt 介绍 JSEncrypt是一个RSA加密库,在没有SSL加密传输通道支持https协议的情况下,该库可以在http传输重要信息如时,保证数据的安全性.我们小组 ...
- 基于websocket实现的一个简单的聊天室
本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...
- C++ string类型小结
目录 构造函数 string.append() string.assign() string.at() string.back() string.begin() string.capasity() s ...