简单模拟 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(小时/次). 各自每小时往 ...
随机推荐
- HDU-5728-PowMod-求phi(i*n)前缀和+指数循环节
HDU-5728-PowMod-求phi(i*n)前缀和+指数循环节 [Problem Description] 令\(k=\sum_{i=1}^m \varphi(i\cdot n)\ mod \ ...
- POJ2482 Stars in Your Window 和 test20180919 区间最大值
Stars in Your Window Language:Default Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K T ...
- ASP.NET MVC 入门5、View与ViewData
View建立时有MVC View Page 和 MVC View Content Page两种类型, 前者为标准View, 后者为可继承Master母版页的View. Asp.Net MVC 默认使用 ...
- django Error: HINT: Add or change a related_name argument to the definition for 'UserProfile.groups' or 'User.groups'.
# 解决方案: 因自己重新封装user为UserProfile故在 settings中 添加自己的
- Spark mllib 随机森林算法的简单应用(附代码)
此前用自己实现的随机森林算法,应用在titanic生还者预测的数据集上.事实上,有很多开源的算法包供我们使用.无论是本地的机器学习算法包sklearn 还是分布式的spark mllib,都是非常不错 ...
- 使用jQuery快速高效制作网页交互特效---表单校验
表单基本验证技术 为什么需要表单验证 减轻服务器的压力 保证输入的数据符合要求 常用的表单验证 1.日期格式 2.表单元素是否为空 3.用户名和密码 4.E-mail地址 5.身份证号码 表单选择器 ...
- linux系列(六):rmdir命令
1.命令格式: rmdir [选项] 目录名 2.命令功能: 该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限. 3.命令参数: - p 删除指定目录后,若该目录的上层 ...
- NetworkX系列教程(2)-graph生成器
小书匠Graph图论 本节主要讲解如何快速使用内置的方法生成graph,官方的文档在这里,里面包含了networkX的所有graph生成器,下面的内容只是我节选的内容,并将graph画出来而已. 声明 ...
- Codeforces 704E Iron Man [树链剖分,计算几何]
Codeforces 这题--真是搞死我了-- 好不容易下定了决心要不颓废,要写题,结果一调就调了十几个小时-- 思路 我们发现在树上做非常不舒服,于是树链剖分之后一次在重链上的移动就可以看做是在df ...
- java打jar包与找不到依赖包详解
eclipse打jar包与找不到依赖包详解 eclipse打工具jar 1.项目右键-->export -->搜索java 2.选择JAR file 3.打包 eclipse打包可执行ja ...