参考 http://www.tuicool.com/articles/RzQRV3

var PENDING = undefined,
FULLFILLED = 1,
REJECTED = 2;
var Promise = function(resolver) { var promise = this;
this.value;
this.reason;
this.status = PENDING;
this.resolver;
this.rejecter; var resolve = function(value) {
promise.value = value;
promise.status = FULLFILLED;
if (promise.resolver || promise.rejecter) {
var ret = promise.resolver.call(null, promise.value);
if(ret instanceof Promise) {
ret.then(promise.resolver_relsolve);
} else {
promise.resolver_relsolve(promise.value);
}
}
} var reject = function(err) {
promise.value = err;
promise.status = REJECTED;
if (promise.resolver || promise.rejecter) {
var ret = promise.rejecter.call(null, promise.value);
if(ret instanceof Promise) {
ret.then(function(){}, promise.rejecter_reject);
} else {
promise.rejecter_reject(promise.value);
}
}
} resolver(resolve, reject);
} // Promise then 方法
Promise.prototype.then = function(onFulfilled, onRejected) {
var promise = this; if (promise.status == FULLFILLED) {
var ret = onFulfilled(promise.value); if(ret instanceof Promise) {
return ret;
} else {
return new Promise(function(resolve) {
resolve(ret);
});
} } else if (promise.status == REJECTED) {
var ret = onRejected(promise.value); if(ret instanceof Promise) {
return ret;
} else {
return new Promise(function(resolve, reject) {
reject(ret);
});
}
} return new Promise(function(resolve, reject) {
promise.resolver = onFulfilled;
promise.resolver_relsolve = resolve;
promise.rejecter = onRejected;
promise.rejecter_reject = reject;
});
}

测试

var p = new Promise(function(resolve, reject) {
console.log('before');
setTimeout(function() {
resolve(10);
}, 2000);
}); p.then(function() {
console.log('after', arguments);
}).then(function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(20)
}, 2000);
});
}).then(function() {
console.log(arguments);
});

输出

// 两秒
before
after [10]
// 两秒
[20]

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

  1. 一个简单的Promise 实现

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

  2. 实现简单的promise

    只考虑成功时的调用,方便理解一下promise的原理promise的例子: 1. 接下来一步步实现一个简单的promise step1:promise 接受一个函数作为构造函数的参数,是立即执行的,并 ...

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

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

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

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

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

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

  6. 简单模拟 Promise

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

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

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

  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. FPGA书籍

    Xilinx FPGA开发实用教程(第2版) 徐文波,田耘 著

  2. 解释器模式(Interpreter Pattern)

    定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpre ...

  3. Python之路,day8-Python基础

    ***面向对象的好处*** 更容易扩展.提高代码使用效率,使你的代码组织性更强,更清晰 更适合复杂项目的开发 封装 把功能的实现细节封装起来,只暴露调用接口 继承 多态 接口继承 定义 类----&g ...

  4. 关于蜂窝物联技术 NBIoT 的一些观点

    背景 SigFox 开始于2009,这项技术对长期作为标准移动电话交互标准的3GPP造成了有力冲击.SigFox 解决了终端设备互联场景下的多个痛点: 1 过于复杂: 2 昂贵的设备: 3 耗电不持久 ...

  5. [原]php远程odbc连接sqlsvr数据库,自定义端口,命名实例的连接方式

    远程odbc连接sqlsvr数据库,自定义端口,命名实例的连接方式,默认如果不修改的话sqlsvr的端口号是1433,默认实例名就是机器名,,如果既用了命名实例,又改了默认端口,改怎么连接数据库呢? ...

  6. 性能测试知多少---系统架构分析 转自https://yq.aliyun.com/articles/35147?spm=5176.100239.blogcont24251.8.lS96At

    摘要: 有些事儿一旦放一放就难再拾起来,突然发现<性能测试知多少>这个系列两月没更新,关键时我都不知道啥时候放下的,总容易被各种技术所吸引走,如饥似渴的想学更多的东西,这几天一直有朋友问我 ...

  7. Saying that Java is nice because it works on every OS is like saying that anal sex is nice because it works on every gender.

    Saying that Java is nice because it works on every OS is like saying that anal sex is nice because i ...

  8. [Spring MVC] - JSON

    Spring MVC中使用JSON,先必需引用两个包:jackson-core-asl-1.9.13.jar.jackson-mapper-asl-1.9.13.jar 因为需要使用到jquery测试 ...

  9. Sphinx的配置和使用

    项目中用到了,昨天老大又给讲了讲,我感觉这玩意真是强大.想把一些功能以很小的代价做好,第三方的工具是必须要掌握的. 1. 我的开发环境在Windows上,下载了sphinx-2.2.6-release ...

  10. Shiro启用注解方式

    shiro验证权限方式一种是基于url配置文件: 例如: <bean id="shiroFilter" class="org.apache.shiro.spring ...