简单模拟 Promise
class promise {
constructor(fn) {
this.data = null;
this.err = null;
this.isPromise = false;
this.errFn = null;
this.queue = [];
this.run = this.run.bind(this);
this.error = this.error.bind(this);
this.then = this.then.bind(this);
this.catch = this.catch.bind(this);
this.reslove = this.reslove.bind(this);
this.reject = this.reject.bind(this);
this.setData = this.setData.bind(this);
this.getData = this.getData.bind(this);
this.setQueue = this.setQueue.bind(this);
this.setErrFn = this.setErrFn.bind(this);
this.getErrFn = this.getErrFn.bind(this);
this.setPromise = this.setPromise.bind(this);
this.getPromise = this.getPromise.bind(this);
fn(this.reslove, this.reject);
return this;
}
setPromise() {
this.isPromise = !this.isPromise;
}
getPromise() {
return this.isPromise;
}
setErrFn(fn) {
this.errFn = fn;
}
getErrFn() {
return this.errFn;
}
setQueue(fn) {
this.queue.push(fn);
}
getQueue() {
return this.queue;
}
setData(data) {
this.data = data;
}
getData() {
return this.data;
}
setErr(err) {
this.err = err;
}
getErr() {
return this.err;
}
reslove(data) {
if (this.getPromise()) return;
this.setPromise();
this.setData(data);
this.run();
}
reject(err) {
if (this.getPromise()) return;
this.setPromise();
this.setErr(err);
this.error();
}
then(fn) {
this.setQueue(fn);
return this;
}
catch(fn) {
this.setErrFn(fn);
}
run() {
const queue = this.getQueue();
let ret = this.getData();
for(let i = 0; i < queue.length; i++) {
// 下面三种方式都可以实现想要的效果
process.nextTick(() => {
ret = queue[i](ret);
});
// setImmediate(() => {
// ret = queue[i](ret);
// });
// setTimeout(() => {
// ret = queue[i](ret);
// }, 0);
}
}
error() {
// 下面三种方式都可以实现想要的效果
process.nextTick(() => {
this.setErrFn(fn)
});
// setImmediate(() => {
// this.setErrFn(fn)
// });
// setTimeout(() => {
// this.getErrFn()(this.getErr());
// }, 0);
}
}
const p = new promise((res, rej) => {
setTimeout(() => {
console.log('s1');
setTimeout(() => {
console.log('s2');
setTimeout(() => {
console.log('s3');
res('res');
rej('rej');
console.log('s4');
}, 1000);
}, 1000);
}, 1000);
});
let pp = p
.then((data) => {
console.log(data);
return 't2';
})
.then((data) => {
console.log(data);
return 't3';
});
pp.then((data) => {
console.log(data);
}).catch((err) => {
console.log(err);
});
上面代码只是简单的进行基础模拟,让回调可以串行化,没有做错误处理、 API 扩展、参数格式化等操作。
Promise 通过高层次的回调抽离,将代码编写方式从回调改写成了串行,需要在熟练使用的基础上对其内核进行深入的理解才能更加灵活地运用。
简单模拟 Promise的更多相关文章
- 简单模拟CO模块
promise方式: // 对co模块的简单模拟 function run(gen){ var g = gen(); function next(data){ var result = g.next( ...
- java web学习总结(二十二) -------------------简单模拟SpringMVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- WPF简单模拟QQ登录背景动画
介绍 之所以说是简单模拟,是因为我不知道QQ登录背景动画是怎么实现的.这里是通过一些办法把它简化了,做成了类似的效果 效果图 大体思路 首先把背景看成是一个4行8列的点的阵距,X轴Y轴都是距离70.把 ...
- 一个简单的Promise 实现
用了这么长时间的promise,也看了很多关于promise 的文章博客,对promise 算是些了解.但是要更深的理解promise,最好的办法还是自己实现一个. 我大概清楚promise 是对异步 ...
- Linux 内核 链表 的简单模拟(2)
接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- JavaWeb学习总结(四十九)——简单模拟Sping MVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- 简单模拟Hibernate的主要功能实现
在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作.这里就简单模拟其底层的实现. /*******代码部分,及其主要注解***** ...
- 【HDU 4452 Running Rabbits】简单模拟
两只兔子Tom和Jerry在一个n*n的格子区域跑,分别起始于(1,1)和(n,n),有各自的速度speed(格/小时).初始方向dir(E.N.W.S)和左转周期turn(小时/次). 各自每小时往 ...
随机推荐
- IntelliJ IDEA lombok插件的安装和使用
IntelliJ IDEA是一款非常优秀的集成开发工具,功能强大,而且插件众多.lombok是开源的代码生成库,是一款非常实用的小工具,我们在编辑实体类时可以通过lombok注解减少getter.se ...
- Java eclipse等常见问题汇总
1.Eclipse 注释模板设置 2.eclipse注释字体大小显示不一样大
- HttpServletRequest获取浏览器、服务端和客户端信息
如何通过HttpServletRequest来获取到上面的属性呢? 1.引入开源工具 <!-- https://mvnrepository.com/artifact/eu.bitwalker/U ...
- struts2--CRUD
struts的CRUD 1.导入相关的pom依赖(struts.自定义标签库的依赖) <dependency> <groupId>jstl</groupId> &l ...
- 三十四.MySQL主从同步 、主从同步模式
mysql51:192.168.4.51 主 mysql52:192.168.4.52 从 mysql50:192.168.4.50 客户机 1.MySQL一主一从 1.1 51,52 安装m ...
- 坑爹的IE8
1.不能用trim(),要用$.trim() var aa = $("#id").val().trim() 这样素不行的,要变成这样Jquery的方式 var aa = $ ...
- 【luoguP4777】【模板】扩展中国剩余定理(EXCRT)
(扩展)中国剩余定理 对于一组同余方程 \(x\equiv a_1(mod \quad n_1)\) \(x\equiv a_2(mod \quad n_2)\) \(x\equiv a_3(mod ...
- tesonflow实现word2Vec
word2Vec 是实现从原始语料中学习字词空间向量的预测模型 使用word2Vec的skip_Gram模型 import collections import math import os impo ...
- git命令如何删除文件或文件夹
拉取远程仓到本地 git clone ×× cd ××× 查看分支 git branch -a 切换到想要操作的分支 git checkout 想要操作的分支 在本地仓库删除文件 git rm 我的文 ...
- 提高python运行效率的方法
让关键代码依赖于外部包:你可以为紧急的任务使用C.C++或机器语言编写的外部包,这样可以提高应用程序的性能 使用生成器,因为可以节约大量内存 多个if elif条件判断,可以把最有可能先发生的条件放到 ...