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

最新文章

  1. IntelliJ Idea 常用快捷键 列表
  2. 如何在Oracle中导入dmp文件
  3. 【转】不可变数组NSArray与可变数组NSMutableArray
  4. iOS 常用控件集合 完整项目
  5. 如何解决paramiko执行与否的问题
  6. 设计模式之:组合模式(Composite)
  7. Delphi 记事本 TMemo
  8. RSYSLOG没那么简单
  9. The C++ Programming Language 学习笔记 第7章 函数
  10. 一些实用的JQuery代码片段收集(筛选,搜索,样式,清除默认值,多选等)
  11. Linux中gcc和g++
  12. C# bootstrap之表格动态绑定值
  13. 「造个轮子」——cicada 源码分析
  14. Flutter: X Android license status unknown
  15. if(变量)的判断
  16. 剑指offer(24)二叉树中和为某一值的路径
  17. Python Tools for Machine Learning
  18. C语——宏小结
  19. LeetCode - Flood Fill
  20. C编程技巧资源

热门文章

  1. opencv 图片识别
  2. 【动态规划】ZZNU-OJ- 2054 : 油田
  3. VGridControl 使用技巧
  4. DTcmsV4.0分析学习——(1)数据库结构分析
  5. virtual box启动error
  6. mysql - 所有笔记
  7. echo 显示命令
  8. java+上传+文件夹
  9. divisors 数学
  10. Bacteria (Gym - 101911C)