1 Promise 是一个异步操作返回的对象,用来传递异步操作的消息

2 根据自己对 Promise 的理解,实现一个Promise

Promise 有三种状态:Pending 初始态; Fulfilled 成功态; Rejected 失败态。

function Promise(executor) {let self = this;self.status = 'pending'; //等待态self.value = undefined;  //成功的返回值self.reason = undefined; //失败的原因function resolve(value){if(self.status === 'pending'){self.status = 'resolved';self.value = value;}}function reject(reason) {if(self.status === 'pending') {self.status = 'rejected';self.reason = reason;}}try{executor(resolve, reject);}catch(e){reject(e);// 捕获时发生异常,就直接失败}
}//onFufiled 成功的回调
//onRejected 失败的回调
Promise.prototype.then = function (onFufiled, onRejected) {let self = this;if(self.status === 'resolved'){onFufiled(self.value);}if(self.status === 'rejected'){onRejected(self.reason);}
}
module.exports = Promise;

3 代码测试

let Promise = require('./Promise');let promise = new Promise(function (resolve, reject) {resolve(100);
})promise.then(function (data) {console.log('data:', data);
},function (err) {console.log('err:', err);
})

输出:data: 100

Promise 实例可以多次then,当成功后会将 then 中的成功方法按顺序执行,我们可以先将 then 中成功的回调和失败的回调存到数组内。当成功的时候调用成功的数组即可。

self.onResolvedCallbacks = [];  /* 存放then成功的回调*/
self.onRejectedCallbacks = [];  /* 存放then失败的回调*/
function resolve(value){if(self.status === 'pending'){self.status = 'resolved';self.value = value;self.onResolvedCallbacks.forEach(function (fn) {fn();})}
}
function reject(reason) {if(self.status === 'pending') {self.status = 'rejected';self.reason = reason;self.onRejectedCallbacks.forEach(function (fn) {fn();})}
}
if(self.status === 'pending'){self.onResolvedCallbacks.push(function () {onFufiled(self.value);})self.onRejectedCallbacks.push(function () {onRejected(self.reason);})
}

4 实现链式调用

众所周知 Promise 的一大特点,就是链式调用。而 Promise 实现链式调用就是通过 then 方法返回一个新的 Promise。

如果第一个 then 中返回了一个结果,会将 Promise 的结果继续传给下一个 then 中;如果有错误则走下一个 then 的失败。

// 添加 resolvePromise 方法 处理链式调用问题
function resolvePromise(p2, x, resolve, reject) {if(p2 === x){return reject(new TypeError('循环引用'));}if(x!==null || (typeof x === 'object' || typeof x === 'function')){try{let then = x.then;if(typeof then === 'function'){then.call(x, function (y) {resolvePromise(promise2, y, resolve, reject);},function (err) {reject(err);});}else{resolve(x);}}catch(e){reject(e);}}else{resolve(x);}
}

尝试实现一个简单的Promise相关推荐

  1. 你已经学会了基本的c语言了,来尝试写一个简单的计算器吧

    关于原问题 第一行输入两个整数,用空格分开: 第二行输入一个运算符(+.-.*./). 所有运算均为整数运算,保证除数不包含0. 这里我们选择switch函数 switch(c){case '+':p ...

  2. promise是什么?简单分析promise原理

    预备知识 回调函数 高级函数 发布-订阅模式 promise A+ 规范 promise是什么,能干什么 Promise是异步编程的一种解决方案,它可以解决异步回调地狱的问题,防止层层嵌套对程序代码带 ...

  3. 电影推荐系统 python简书_分析9000部电影|一个简单的电影推荐系统

    不知道大家平时喜不喜欢看电影来消遣时光,我是比较喜欢看电影的.对我而言,当我看完一部电影,觉得很好看的时候,我就会寻找类似这部电影的其他电影.刚好有这么一个数据集,包含了很多部的电影,于是打算对其进行 ...

  4. 如何写shell脚本?尝试自己编写一个简单脚本。

    1 背景介绍 每次发布tomcat项目的时候都要反复敲一些命令,重启tomcat之前先检查tomcat进程有没有停掉,没有还要手动kill该进程,单独部署一个项目还好,如果一次多个部署,就比较费劲了 ...

  5. 使用redis实现缓存_用下一个js实现一个简单的redis缓存

    使用redis实现缓存 For most websites, the changing pieces don't actually vary that often. That immutability ...

  6. 用php做一个简单的汇率,vue实现简单实时汇率计算功能

    最近在自己摸索vue的使用,因为相对于只是去看教程和实例,感觉不如自己动手写一个demo入门来的快.刚好看到小程序中有一个简单但是很精致的应用极简汇率,而且它的表现形式和vue的表现形式很像,于是想着 ...

  7. 用 cooking 搭建一个简单又优雅的 Vue 项目开发环境 (入门篇)

    本文适合 Vue 的初学者,以及对 webpack 不熟悉的同学阅读.前提是你要会用基本的命令行. Node 和 NPM,以及掌握 ES2015 的基础知识.本文都是在 macOS 环境下运行,要求使 ...

  8. python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库

    python如何编写数据库 MySQL, PostgreSQL, Oracle, Redis, and many more, you just name it - databases are a re ...

  9. 如何在 Python 中创建一个简单的神经网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 在过去的几十年里,机器学习对世界产生了巨大的影响,而且它的普 ...

最新文章

  1. MYSQL 连接数据库命令收藏
  2. PHP+Mysql数据库操作简类
  3. 必看!程序员逃生指南
  4. 阿里宣布Atlas正式开源:带你重返App开发的田园时代
  5. 数据库时间字段条件操作善用TO_DAYS函数等
  6. java stream中Collectors的用法
  7. 编译时错误之 error C2338: tuple_element index out of bounds
  8. c语言指着与数组,C语言指针与数组
  9. Data URI scheme 在 html 中嵌入小图片
  10. python的数据库_python数据库操作-mysql数据库
  11. 检测直线方法 python
  12. python客户画像_Python数据分析学习笔记05:用户画像
  13. Redis内存分析方法
  14. 人人都可以开发高可用高伸缩应用——论Azure Service Fabric的意义
  15. 初学者如何选择网络仿真软件
  16. 未来互联网+大数据时代
  17. java jvm sdk_JDK、SDK、JRE、JVM概念详解
  18. JavaScript复习笔记(三)数组及数组API
  19. 外贸独立站怎么提高转化率
  20. Js模拟重力场【Js动效】

热门文章

  1. Okhttp请求工具类
  2. Feed 流系统杂谈
  3. xdebug 调试php,怎么用Xdebug调试PHP
  4. 全球「数字游民」现状,有人已经72岁了
  5. [C++] [OpenGL] GLFW工具类
  6. 老话题新解说:究竟什么是敏捷测试?
  7. 数据表的基础操作(三)修改
  8. ldap数据库--ldapsearch,ldapmodify
  9. Win10 笔记本无线网卡Intel(R) Wireless-AC 9560无法启动 报错代码: 10 网络适配器里面也没有WLAN WIFI突然没了 不能搜索WIFI 该怎么办 解决经验分享
  10. C++:stat函数