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. windows10下安装tensorflow2.0-GPU和Cupy(不用搞CUDA+cudnn)

    0.前言 今年暑假买了个1660ti的游戏本学python,后来发现跑一些数据量比较大的代码和深度学习的时候太慢了,遂想装一下GPU版本,看了网上的资料搞了好几天,又是CUDA又是cudnn的,网速慢 ...

  2. Gym - 102012H Rikka with A Long Colour Palette N线段K色贪心染色

    给你数轴上的N条线段和K种颜色 K和N1e5 要你把这N条线段染色 使得有K种不同颜色的线段长度最长 首先很容易想到被至少K段线段覆盖的区间是一定有贡献的 接下来就是怎么染色的问题 我们把这N个区间的 ...

  3. P1078 文化之旅[最短路]

    题目背景 本题是错题,后来被证明没有靠谱的多项式复杂度的做法.测试数据非常的水,各种玄学做法都可以通过(比如反着扫),不代表算法正确.因此本题题目和数据仅供参考. 题目描述 有一位使者要游历各国,他每 ...

  4. uni-app之导航配置pages.json

    1.基础配置,各个页面都要在这里边引入. 2.基础配置,头部导航左右上脚的buttons设置. 3.如果没有权限展示底部导航的需求,可以直接在此文件配置底部导航.

  5. 并发编程大师系列之:Synchronized的类锁和对象锁

    说到并发编程,感觉跟大多数人一样,谈之色变,说它简单把,其实很有内容,说难吧,用起来也挺容易,最近我硬着头皮,决心要把并发编程好好的搞一遍.以前,面试的时候,面试官问,并发编程会吗?嗯,接触过,就加一 ...

  6. HTML5 服务器发送事件(Server-Sent Events)

    沈阳SEO:HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获 ...

  7. 有关求第n位xxx 的算法的问题

    最近,博客园上看到有关求 斐波那契数列的第n位是什么的问题.什么是 斐波那契数列? 我自己也忘记了,后来百度了下.http://baike.baidu.com/view/816.htm?fr=alad ...

  8. ORACLE数据库误操作执行了DELETE,该如何恢复数据?

    ORACLE数据库误操作执行了DELETE,该如何恢复数据? 原创 2016年08月11日 17:23:04 10517 作为一个程序员,数据库操作是必须的,但是如果操作失误,一般都会造成比较严重的后 ...

  9. 批量清理harbor镜像

    #! /bin/bash # 通过Harbor提供的API来批量删除镜像,人工删除费时费力 # 经过测试发现,通过接口去删除时提供的是的标签,但实际上删除的时候通过的是镜像的IMAGE_ID,也就是说 ...

  10. Codeforces Round #459 (Div. 2) C题【思维好题--括号匹配问题】

    题意:给出一个串,只包含 ( ? ) 三种符号,求出有多少个子串是完美匹配的. ( ) ? ) => ( ) ( ) 完美匹配( ( ) ? => ( ( ) )完美匹配? ? ? ? = ...