直接代码

// 声明函数
function MyPromise(fun) {this.state = 'Pending';    // 状态基this.value = '';   // 成功回调的默认值this.successFun = [];    // 成功回调函数数组this.errFun = [];   var _self = this;// 成功时候执行function resolve(value) {// 这里需要注意,判断返回值是不是一个新的promise,  如果是,需要把这个promise.then执行得到成功的值,//返回的值在继 续往下走if (value && value instance of MyPromise) {value.then(resolve)return}_self.state = 'Fulfilled'_self.value = valueif (_self.successFun.length > 0) {_self.successFun.forEach(cb => {cb(value)}) }};function reject(err) {_self.value = err_self.state = 'Rejected'_self.errFun.forEach(cb => {cb(err)}) };fun(resolve, reject);return _self;
}// 在原型对象上,声明then方法
MyPromise.prototype.then = function(success, err) {var _self = this;var promise2;// then 方法都是返回新promiseswitch(this.state) {case 'Fulfilled':promise2 = new MyPromise(function(resolve, reject) {resolve(success(_self.value))})breakcase 'Rejected':promise2 = new MyPromise(function(resolve, reject) {reject(err(_self.value))})breakcase 'Pending':promise2 = new MyPromise(function(resolve, reject) {_self.successFun.push(function() {resolve(success(_self.value))})_self.errFun.push(function() {reject(err(_self.value))})})break}return promise2
}// 调用
var p = new MyPromise(function(res, rej) {setTimeout(function(){res(2222)}, 1000)
})var a = p.then(function (result) {console.log(result)return new MyPromise(function(res, rej) {setTimeout(function() {res(3333)}, 2000)res(33333)})
})var b = a.then(function (result) {console.log(result)return 44444
})var c = b.then(function (result) {console.log(result)return 55555
})
复制代码

注意

  • then的声明阶段是把新返回的promise的resolve方法的引用提交上一个promise成功回调里面等待执行
  • 执行then的成功回调,得到上个reslove传来的值,处理得到的值传给下一个resovle(value)

实现自己的promise相关推荐

  1. setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)

    本文很长,列举的情况很多. 在阅读本文之前,如果您有充足的时间,请新建一个项目与本文一同实践. 每段代码都有对应的解释,但是自己动手尝试印象才会更深哦~ setInterval:表示多久执行一次,需要 ...

  2. C++多线程:异步操作std::async和std::promise

    文章目录 std::async 简介 使用案例 std::promise 简介 成员函数 总结 之前的文章中提到了C++多线程中的异步操作机制 C++ 多线程:future 异步访问类(线程之间安全便 ...

  3. ES6中的Promise详解

    Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...

  4. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...

  5. promise实现多个请求并行串行执行

    早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...

  6. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  7. 自己动手写cpu pdf_自己动手写 Promise

    这段时间在学习Promise,但始终不得要领.为了更好地理解Promise,我决定自己实现一个简易版的Promise,以学习Promise工作原理.该工程名为ToyPromise,仓库地址如下: ht ...

  8. promise 和 async await区别

     什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. as ...

  9. Promise - js异步控制神器

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. 正文: 首先给来一个简单的demo看看Promise是怎么使用的: <!DOCTYPE html> ...

  10. Promise的实例用法

    设定函数 function chiFan() {return new Promise(function(resolve, reject) {console.log("chiFan" ...

最新文章

  1. 2 关于数据仓库维度数据处理的方法探究系列——无变化维度处理
  2. 如何插入页面,PDF怎么插入页面
  3. 用平方映射理解tanh
  4. python读取windows日志_Python解析windows系统日志文件
  5. 英特尔第11代台式机处理器发布:或将是14nm最后的倔强
  6. 算法----迷宫问题
  7. Spring Boot配置文件yml格式详解
  8. ROS入门之创建节点
  9. php连接phpmyadmin,怎么访问phpmyadmin
  10. Javamail 发送163邮件
  11. 移动端字体加粗的解决方案
  12. c语言编写生日祝福语大全,C++求高手帮忙写个程序...输出“生日快乐”四个字..用符号拼出来..谢谢啦...
  13. 程序员需要了解的硬核知识之操作系统入门
  14. 专利申请流程及费用,需要准备什么材料,
  15. PDF如何转换成Word
  16. 《HTML5 Canvas学习笔记(10)》数钱数到手抽筋
  17. 如何删除金山毒霸卸载后的残余文件
  18. 面试06,[长亮科技]()(offer)、[荔枝]()FM(在确定部门和薪资)、[涂鸦智能]()(第一轮电话面半小时,待后续)、华资软件(HR面)、[广州速游]()(已挂)。至于公司怎么样不加以言论。
  19. 【安全知识分享】企业安全管理基础台账(44页).pptx(附下载))
  20. 服务器性能自动化测试脚本

热门文章

  1. 下载的代码找不到rt.jar中的类
  2. axi4协议的乱序_一篇文章读懂读透FPGA AXI4 总线协议
  3. resultmap的写法_Mybatis的ResultMap的使用
  4. ssh提示connection refused_2020高考语法填空必会技巧之有提示词(一)
  5. vbscript html 在线,在HTML中使用VBScript可用三种方法
  6. 右键新建里面没有word和excel_Excel中为什么修改了新建工作簿的选项,新建以后还是没有生效...
  7. js return 闭包为null_js 基础知识总结
  8. 关于CodeReview
  9. matlab怎么看输出电压纹波,教你如何正确取电源的输出纹波噪声值
  10. qt扫雷鼠标c语言中文网,基于C语言实现的扫雷游戏代码