JS简单实现Promis(没有实现then链调用)

// 实现Promise
function _Promise(fn){// 要求接收的fn必须是一个函数,否则报错if(typeof fn !== 'function') {throw new TypeError('_Promise resolver undefined is not a function')}// 每个实例应该有这两个属性:state,resultthis.state = 'pending'; // 初始状态为 pendingthis.result = undefined;  // 初始结果为 undefined// 事件池(自定义):这里存放的是then中传递的A函数和B函数this.eventPool = {A: function(){},B: function(){}}// 立即执行传递进来的fn函数:但是在执行fn的时候得给fn床底两个函数 resolev,rejectvar that = this;function resolve(res){ // 这里接收一个参数,作为当前实例的result值// 执行这个函数的时候会将当前实例的状态从 pending转为 resolved/* if(that.state !== 'pending') return;that.state = 'resolved';that.result = res; */change('resolved', res)}function reject(rej){// 这里接收一个参数,作为当前实例的result值// 执行这个函数的时候会将当前实例的状态从 pending转为 rejected/*  if(that.state !== 'pending') return;that.state = 'rejected';that.result = rej; */change('rejected', rej)}// resolve函数和reject函数代码冗余,整合成一个function change(state, result){// 如果状态已经不是初始状态了,则直接退出,否则改变其状态和结果,并同时事件池中对应的函数执行if(that.state !== 'pending') return; that.state = state;that.result = result;// 通知事件执行时异步的setTimeout(function(){that.state === 'resolved'? that.eventPool.A(that.result): that.eventPool.B(result);})}// 注意:执行fn的时候,如果有报错,则当前实例的状态为失败,值为失败的原因try{fn(resolve, reject); }catch(err){change('rejected', err);}
}// _Promise的原型上有一个then方法,该方法接收两个函数A和B,根据实例的状态自动识别执行A还是B
_Promise.prototype.then = function(A, B){// this:当前_Promise的实例this.eventPool.A = A;this.eventPool.B = B;
}// 快速创建一个状态为成功的实例
_Promise.resolve = function(res) {return new _Promise(function(resolve){resolve(res)});
};// 快速创建一个状态为失败的案例
_Promise.reject = function(res) {return new _Promise(function(undefined, rejecte){rejecte(res)});
};let p = new _Promise(function(resolve, reject){// resolve(200);reject(300);
});p.then(res=>{console.log(res);
}, rej=>{console.log(rej);
});_Promise.resolve(200).then(res=>{console.log(res)
});_Promise.reject(400).then(res=>{}, rej=>{console.log('失败', rej)
});console.log('同步');
/* * 输出结果:同步300200失败 400
*/

JS简单实现Promis(没有实现then链调用)相关推荐

  1. web前端面试高频考点——JavaScript 篇(一)【JS的三座大山 】 原型和原型链、作用域和闭包、异步

    系列文章目录 JavaScript 知识梳理,收录了web前端面试 95%以上 的高频考点,满满的干货.给你做一个高效的知识梳理,为你的面试保驾护航! 内容 参考链接 HTML & CSS 篇 ...

  2. EChart.js 简单入门

    EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Visual Studio里的自带控件,使用比 ...

  3. Py:python利用easygui实现最简单GUI带你学习区块链技术的发展和由来

    Py:python利用easygui实现最简单GUI带你学习区块链技术的发展和由来 目录 输出结果 实现代码 输出结果 实现代码 # -*- coding: utf-8 -*- ''' Created ...

  4. js简单验证码的生成和验证

    如何用js生成简单验证码,并验证是否正确的方法 1.html页面如下 <div><table border="0" cellspacing="5&quo ...

  5. pc端html轮播带滑块,swiper.js简单快速实现轮播滑动(兼容PC端、移动端)

    swiper是一款免费以及轻量级轮播滑动的js框架,适用于PC端跟移动端,官方地址:(https://www.swiper.com.cn/) 效果演示: PC端 移动端(在浏览器将设备切换为手机,这里 ...

  6. js 简单的滑动教程(四)

    作者:Lellansin 转载请标明出处,谢谢 在大概的了解滑动的基本原理和怎么去实现之后,现在我们将更深入的去讨论js的滑动. 相信细心的朋友应该已经发现了,在本教程前几篇中的代码,还存在着bug, ...

  7. php 修改input内容,JS简单获取并修改input文本框内容的方法示例

    这篇文章主要介绍了JS简单获取并修改input文本框内容的方法,结合实例形式分析了JavaScript针对页面元素的获取.赋值等相关操作技巧,需要的朋友可以参考下 本文实例讲述了JS简单获取并修改in ...

  8. H5原生js简单拼图游戏

    H5原生js简单拼图游戏 演示地址 效果展示 源码 index.html puzzle.css puzzle.js 源码下载 演示地址 链接: 演示地址 效果展示 源码 index.html < ...

  9. js简单交互动画,运动吧

    今天看了一下慕课网上讲解js简单动画的视频教程,讲解确实挺细致的,大家可以去慕课网搜一下.OK,下面的内容就是我的学习总结,以方便日后的"回访",哈哈!由于是总结,我就不贴完整的源 ...

最新文章

  1. 80年代高考数学卷,共10套,有您做过的高考卷吗?
  2. vue生命周期及双向绑定
  3. 露雨资源库(第一个.net2.0软件)二
  4. Spring Cloud 第一天课堂笔记
  5. Atcoder Keyence Programming Contest 2020 D - Swap and Flip
  6. Sqlite3中replace语句用法详解
  7. js 根据掩码位计算可用ip地址_变长子网掩码:轻松分配IP地址(下)
  8. MySQL之TCL(事务控制)语句
  9. Spring : 异步注解 @EnableAsync 和 @Async
  10. Lightsail和EC2有什么区别? [关闭]
  11. 【笔记——Java】读取properties文件
  12. BenchmarkSQL 测试Oracle 12c TPC-C 性能
  13. insertBefore方法(javascript与jQuery)
  14. Bootstrap3学习笔记
  15. ros下各个包中的map的格式
  16. 小程序中上传图片并进行压缩(二)
  17. HTML5标准制定完成,浏览器大战能消停吗?
  18. mysql sql语法解析器_Druid SQL 解析器概览
  19. 郭盛华一生特别自律,这两样东西从不沾,网友:不愧是教父级人物
  20. http和https分别是什么?

热门文章

  1. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)...
  2. 创业三年,走通一条路
  3. 计组与OS中的“透明“
  4. 2021-10-18组会记录
  5. ant pattern 语法
  6. Itext 实现 html转换成pdf
  7. c语言终止 fget stdin 输入流
  8. html图标右上角添加小图标,图片右上角增加删除图标(css布局示例)
  9. python列表常见排序方法
  10. python py启动闪退_运行ride.py报错,闪退