只考虑成功时的调用,方便理解一下promise的原理
promise的例子:

1、

接下来一步步实现一个简单的promise

step1:
promise 接受一个函数作为构造函数的参数,是立即执行的,并且返回个resolve函数作为该函数的回调

function CPromise(fun){
  function resolve(){
  }
fun(resolve);
}

step2:

promise的then方法接受一个函数作为参数,并且该函数的参数值,来自于resolve方法中传入的参数,说明resolve运行时,实际上运行了then函数中作为参数的函数(注册该函数)

调用then方法(相当于先注册返回成功后需要执行的函数,参考观察者模式),实际上就是在promise异步返回后,将所有需要处理的回调函数放入callbacks中,当resolve触发时,逐个执行callbacks中的回调。

function CPromise(fun){
this.callback = null;
  function resolve(data){
this.callback(data);
  }
this.then = function(callback){
this.callback = callback;
}
fun(resolve);
}

此时运行

step3:

说明在resolve方法被运行时,then中的函数还没有被注册(因为代码是同步的,所以直接就运行了resolve),所以加一个延迟,保证调用时一定被注册了,call用来绑定Cpromise 中的this作用域,原生promise并不需要

function CPromise(fun){
this.callback = null;
  function resolve(data){
    setTimeout(()=>{
      this.callback(data);     });
  }
this.then = function(callback){
this.callback = callback;
}
fun.call(this,resolve);//绑定this作用域,this.callback时使用
}

step4:

满足多次调用then,可以设置一个数组存储then中注册的函数

function CPromise(fun){
this.callbacks = [];
  function resolve(data){
    setTimeout(()=>{
      this.callbacks.forEach(function(fun){
  fun(data);
  });
   });
  }
this.then = function(callback){
this.callbacks.push(callback);
}
fun.call(this,resolve);
}

step5:
加入状态机制,当promise的状态还在Pending时,then中注册的事件就push到队列中,如果已经Fulfilled,那么之后注册的事件立即执行

promise的例子:

theh中的事件是在resolve运行后才注册的,说明当状态已经是Fulfilled后,所有注册的事件都是立即执行的

function CPromise(fun){
this.callbacks = [],
state='pending',
value = null;
  function resolve(data){
this.value = data;
    setTimeout(()=>{
this.state = 'fulfilled';
      this.callbacks.forEach(function(fun){
   fun(data);
   });
   });
  }
this.then = function(callback){
if(this.state == 'pending'){
this.callbacks.push(callback);
}
callback(this.value);
}
fun.call(this,resolve);
} function a(){
var c = b();
setTimeout(function(){
console.info();
c.then(function(data){
console.info(data);
})
c.then(function(data){
console.info('a'+data);
})
},);
}
function b(){
return new CPromise(function(resolve) {
console.info();
resolve.call(this,);
})
}
a();

实现简单的promise的更多相关文章

  1. 一个简单的Promise 实现

    用了这么长时间的promise,也看了很多关于promise 的文章博客,对promise 算是些了解.但是要更深的理解promise,最好的办法还是自己实现一个. 我大概清楚promise 是对异步 ...

  2. 如何用原生JS实现一个简单的promise

    我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...

  3. 简单版 Promise/A+,通过官方872个测试用例

    promise 标准 在实现 Promise 之前要清楚的是 JavaScript 中的 Promise 遵循了 Promises/A+ 规范,所以我们在编写 Promise 时也应当遵循这个规范,建 ...

  4. 聊一聊看似简单的Promise.prototype.then()方法

    Promise.prototype.then() Proise实例的then方法是定义在原型对象Promise.prototype上的,它的作用是为Promise实例添加状态改变时的回调函数. 该方法 ...

  5. 简单模拟 Promise

    class promise { constructor(fn) { this.data = null; this.err = null; this.isPromise = false; this.er ...

  6. [手写系列] 带你实现一个简单的Promise

    简介 学习之前 需要先对Promise有个基本了解哦,这里都默认大家都是比较熟悉Promise的 本次将带小伙伴们实现Promise的基本功能 Promise的基本骨架 Promise的then Pr ...

  7. 简单的 Promise 实现

    参考 http://www.tuicool.com/articles/RzQRV3 var PENDING = undefined, FULLFILLED = 1, REJECTED = 2; var ...

  8. 简单的 Promise 实现 一

    const Promise = function(fn){ let state = { pending: "pending", fulfilled: "fulfilled ...

  9. 手写简单的promise

    function Promise(fn) { var that = this; this.status = "pedding"; this.value = undefined; / ...

随机推荐

  1. wifi基本原理

    参考链接: https://www.cnblogs.com/zhoading/p/8891206.html https://openwrt.org/zh-cn/doc/uci/wireless htt ...

  2. [精品书单]3D打印机课程设计

    3D打印机整个绘图过程........... 三维图 工程图 编程

  3. 06mycat使用haproxy进行负载均衡

    集群的服务器列表 在10.11.0.210和10.11.0.216中部署mycat和haproxy(因为实验机器性能有限,实际生产环境中需要单独用服务做haproxy反向代理) 两台机器的Mycat配 ...

  4. springboot接口返回封装与异常控制

    首先,返回有两个状态,status和code status标识response的状态,有2个值:0成功,-1服务错误. code跟业务有关,可以有各种数值,99999服务未知异常,10000参数异常, ...

  5. linux部署dns内网服务器

    安装: yum -y install bind* 编辑named.conf vim /etc/named.conf options { listen-on port { any; }; listen- ...

  6. java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类

    package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...

  7. bzoj 5495

    今年省选题... 表示当时还没学可持久化trie,所以打60分暴力走人... 现在学了可持久化字典树,就可以搞一搞了嘛! 首先看到题目描述,很容易想到首先搞出异或前缀和,然后建起可持久化字典树 然后考 ...

  8. 2018-2019-3 20165314《网络对抗技术》Exp2 后门原理与实践

    1.实验内容 任务一:使用netcat获取主机操作Shell 1.在Windows下使用ipconfig查看本机IP: 2.使用ncat.exe程序监听本机的5314端口: 3.在Kali环境下,使用 ...

  9. 2018-2019-2 网络对抗技术 20165328 Exp3 免杀原理与实践

    一.实验要求: . 实践内容(.5分) .5分),msfvenom生成如jar之类的其他文件(.5分),veil-evasion(.5分),加壳工具(.5分),使用shellcode编程(1分) .5 ...

  10. SpringBoot的事件监听

    事件监听的流程分为三步:1.自定义事件,一般是继承ApplicationEvent抽象类.2.定义事件监听器,一般是实现ApplicationListener接口.3.a.启动的时候,需要将监听器加入 ...