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);
});
// 输出
// s1
// s2
// s3
// s4
// res
// t2
// t3

上面代码只是简单的进行基础模拟,让回调可以串行化,没有做错误处理、 API 扩展、参数格式化等操作。

Promise 通过高层次的回调抽离,将代码编写方式从回调改写成了串行,需要在熟练使用的基础上对其内核进行深入的理解才能更加灵活地运用。

简单模拟 Promise的更多相关文章

  1. 简单模拟CO模块

    promise方式: // 对co模块的简单模拟 function run(gen){ var g = gen(); function next(data){ var result = g.next( ...

  2. java web学习总结(二十二) -------------------简单模拟SpringMVC

    在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...

  3. WPF简单模拟QQ登录背景动画

    介绍 之所以说是简单模拟,是因为我不知道QQ登录背景动画是怎么实现的.这里是通过一些办法把它简化了,做成了类似的效果 效果图 大体思路 首先把背景看成是一个4行8列的点的阵距,X轴Y轴都是距离70.把 ...

  4. 一个简单的Promise 实现

    用了这么长时间的promise,也看了很多关于promise 的文章博客,对promise 算是些了解.但是要更深的理解promise,最好的办法还是自己实现一个. 我大概清楚promise 是对异步 ...

  5. Linux 内核 链表 的简单模拟(2)

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...

  6. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  7. JavaWeb学习总结(四十九)——简单模拟Sping MVC

    在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...

  8. 简单模拟Hibernate的主要功能实现

    在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作.这里就简单模拟其底层的实现. /*******代码部分,及其主要注解***** ...

  9. 【HDU 4452 Running Rabbits】简单模拟

    两只兔子Tom和Jerry在一个n*n的格子区域跑,分别起始于(1,1)和(n,n),有各自的速度speed(格/小时).初始方向dir(E.N.W.S)和左转周期turn(小时/次). 各自每小时往 ...

随机推荐

  1. P1080 【NOIP 2012】 国王游戏[贪心+高精度]

    题目来源:洛谷 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...

  2. Javascript基础(1)

    1 Javascript介绍 1.1 js是一款运行在客户端的网页编程语言 1.2 组成部分 (1)ECMAScript:ECMAScript不是一门语言,而是一个标准.符合这个标准的比较常见的有:J ...

  3. Mybatis配置文件中#{ }和${ }的区别

    #{ }和${ }都可以从map中取到相对应的值, 但是 #{ }采取的是预编译的方式(PreparedStatement)来执行sql语句,有效防止了sql注入问题 select * from bo ...

  4. Spring事务管理器

    1.创建实体和接口 public class Bank { private Integer id; private String name; private String manay; public ...

  5. 简单聊聊TiDB中sql优化的一个规则---左连接消除(Left Out Join Elimination)

    我们看看 TiDB 一段代码的实现 --- 左外连接(Left Out Join)的消除; select 的优化一般是这样的过程: 在逻辑执行计划的优化阶段, 会有很多关系代数的规则, 需要将逻辑执行 ...

  6. 一些VMware vCenter Appliance的默认用户名和密码

    一些VMware vCenter Appliance的默认用户名和密码 2014-03-30 17:30:03 flowershade_21 阅读数 13367更多 分类专栏: vmware   VM ...

  7. MongoDB 如何使用内存?为什么内存满了?

    最近接到多个MongoDB内存方面的线上case及社区问题咨询,主要集中在: 为什么我的 MongoDB 使用了 XX GB 内存? 一个机器上部署多个 Mongod 实例/进程,WiredTiger ...

  8. Linux操作系统常用命令合集——第二篇- 用户和组操作(15个命令)

    一.前言:本篇介绍用户和组操作的15个命令,在介绍之前我们先来看看几个示例 1.先进入到etc目录下,找到passwd文件,用vi编辑器查看: # vi /etc/passwd 解释:这里面存放着Li ...

  9. 【luoguP4777】【模板】扩展中国剩余定理(EXCRT)

    (扩展)中国剩余定理 对于一组同余方程 \(x\equiv a_1(mod \quad n_1)\) \(x\equiv a_2(mod \quad n_2)\) \(x\equiv a_3(mod ...

  10. NetworkX系列教程(7)-对graph进行分析

    小书匠Graph图论 graph构建完成后,对graph的连通等属性进行分析. 目录: 8.对图进行分析 8.1连通子图 8.2弱联通 8.3强连通 8.4子图 8.5条件过滤 注意:如果代码出现找不 ...