在promise  的then  中我们不仅有 成功状态 失败状态,可能还有等待状态,所以我们要对等待状态进行处理

function  Promise(executor) {
let self = this;
self.value = null;
self.reason = null;
self.resolveCallback = [];
self.rejectCallback = [];
//设置默认状态
self.status = 'pending'
//成功函数
function resolve(value) {
if(self.status=='pending') {
self.status = 'success';
// console.log(self.value);
self.value = '运行成功了';
self.resolveCallback.forEach(fn=>fn()); // 发布
}
};
//失败函数
function reject(reason) {
if(self.status == 'pending') {
self.status = 'fail';
self.reason = '运行失败了';
self.rejectCallback.forEach(fn=>fn()); // 发布
}
}
//默认立即执行函数 传递两个参数
executor(resolve,reject);
}
Promise.prototype.then = function(OnResolve,OnReject) {
// console.log(this.value)
if(this.status == 'success') {
OnResolve(this.value);
}
if(this.status =='fail') {
OnReject(this.reason);
}
//第3种状态 处于等待状态
if(this.status == 'pending') {
//将成功的回调push 到 resolveCallback 这个数组中
this.resolveCallback.push(()=>{
OnResolve(this.value);
})
//将失败的回调 push 到 rejectCallback 这个数组中
this.rejectCallback.push(()=>{
OnReject(this.reason);
})
}
};
module.exports= Promise;
//一进来 我们开始执行 executor函数 传递两个参数 再调用 then 方法 ,then 方法里面有 OnResolve方法,OnReject 方法
// then 方法中,我们一开始的状态是pending 然后根据 状态的不同 调用不同的函数,
// 在两个不同的函数中 我们 进行判断 因为状态一开始都是有 pending = > success 或者 pending =>fail
// 判断 时修改 状态 和 显示值

在 then  方法中 我们先进行状态的判断 ,如果这个状态是 pending  状态 ,我们就对它进行处理

首先先声明 成功状态的回调数组 为空 失败状态的回调数组为空

  self.resolveCallback = [];
self.rejectCallback = [];

在等待状态中 我们将  成功的函数 push 到 成功状态的回调数组 中,将失败函数push  到失败状态的回调 数组中

 //将成功的回调push 到 resolveCallback 这个数组中
this.resolveCallback.push(()=>{
OnResolve(this.value);
})
//将失败的回调 push 到 rejectCallback 这个数组中
this.rejectCallback.push(()=>{
OnReject(this.reason);
})

同时我们将 状态的值传递进去

最后 在各自的执行函数进行数组的遍历 调用自身的函数

  self.resolveCallback.forEach(fn=>fn()); // 发布

理解Promise (3)的更多相关文章

  1. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

  2. 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)

    本文同步自我的个人博客: http://mly-zju.github.io/ 众所周知javascript语言的一大特色就是异步,这既是它的优点,同时在某些情况下也带来了一些的问题.最大的问题之一,就 ...

  3. 理解Promise的三种姿势

    译者按: 对于Promise,也许你会用了,却并不理解:也许你理解了,却只可意会不可言传.这篇博客将从3个简单的视角理解Promise,应该对你有所帮助. 原文: Three ways of unde ...

  4. 理解Promise的3种姿势

    译者按: 对于Promise,也许你会用了,却并不理解:也许你理解了,却只可意会不可言传.这篇博客将从3个简单的视角理解Promise,应该对你有所帮助. 原文: Three ways of unde ...

  5. 分步理解 Promise 的实现

    一个 Promise 的运用: var firstPromise = new Promise(function(resolve,reject){ setTimeout(function(){ var ...

  6. 理解promise 02

    1:promise是什么? 就是(链式)包装的回调函数. 2:语法 new Promise( function(resolve, reject) {...} /* executor */ ); exe ...

  7. 160701、理解 Promise 的工作原理

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...

  8. 160623、理解 Promise 的工作原理

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...

  9. 理解Promise简单实现的背后原理

    在写javascript时我们往往离不开异步操作,过去我们往往通过回调函数多层嵌套来解决后一个异步操作依赖前一个异步操作,然后为了解决回调地域的痛点,出现了一些解决方案比如事件订阅/发布的.事件监听的 ...

  10. 理解promise 01

    原文地址: http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html 用Javascript的小伙伴们,是时候承认了,关于 ...

随机推荐

  1. JS判断Android、iOS或浏览器的多种方法(四种方法)

    第一种:通过判断浏览器的userAgent,用正则来判断是否是ios和Android客户端. 代码如下: <script type="text/javascript"> ...

  2. Day3 02判定两个对象的引用是否相同

    C#中类型分为值类型和引用类型 清楚了他俩的区别,像验证下,如果在C++中,就可以通过指针直接看地址,但是C#中,找了一会儿没找到方法(主要是我技术比较菜). 不过,用根基类的ReferenceEqu ...

  3. Wowza 4.5 修改 manager 端口号

    //编辑下面的文件, 搜索8088 有两处,改为想要的端口号即可 vim /usr/local/WowzaStreamingEngine/manager/bin/startmgr.sh // 重启服务 ...

  4. React-Native 之 GD (七)下拉刷新 及 上拉加载更多

    1.下拉刷新  使用第三方插件 下载插件: $ npm install react-native-pull@latest --save 引入: import {PullList} from 'reac ...

  5. 用Vue来实现音乐播放器(十五):处理得到的歌手数据

    之前得到的歌手数据是用forEach遍历添加的  没有顺序性  我们希望得到的数据是title:"热门"的数据在最上面  title为字母的数据按字母从低到高顺序排列 var ho ...

  6. 一个DRF框架的小案例

    第一步:安装DRF DRF需要以下依赖: Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6) Django (1.10, 1.11, 2.0) DRF是以Django扩展应用的 ...

  7. 关于 token

    用户在浏览器做一系列操作,后台服务怎么判断这些操作是来自同一个用户? 1. seesion 用户登录后,后台生成 sessionid 返回给浏览器,浏览器的每次请求带上 sessionid,后台关联 ...

  8. SoapUI学习之SOAP和REST的区别

    一.Soap和Rest的定义 SOAP(Simple Object Access Protocol 简单对象访问协议),用于在Web Service中把远程调用和返回封装成机器可读的格式化数据,事实上 ...

  9. 20191103 《Spring5高级编程》笔记-第4章

    第4章 详述Spring配置和Spring Boot 4.2 管理bean生命周期 通常,有两个生命周期事件与bean特别相关:post-initialization和pre-destruction. ...

  10. SpringBoot 使用logback

    1.添加pom引用 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback ...