参考 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. Getting Real 开发宝典

       此书是管理者.程序员或设计师必学的宝典.它以更小的规模,更快的速度,更高的质量来完成软件开发,使产品更简单.粗暴(精致).      近百条精炼总结,不要奢望一次全部记住或理解,只要能理解或做到 ...

  2. (转) Deep Learning Resources

    转自:http://www.jeremydjacksonphd.com/category/deep-learning/ Deep Learning Resources Posted on May 13 ...

  3. Socket 通信(基础原理、实时聊天系统雏形)

    什么是 Socket? Socket 英文直译为"孔或插座",也称为套接字.用于描述 IP 地址和端口号,是一种进程间的通信机制.你可以理解为 IP 地址确定了网内的唯一计算机,而 ...

  4. MYCAT 配置(转)

     server.xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:se ...

  5. .NET设计规范————命名规范

    NET设计规范:约定.惯用法与模式———命名规范 前言:          最近在看<.NET设计规范:约定.惯用法与模式>一书,主要还是讲.NET的设计规范,以前对这一块也不是特别在意, ...

  6. java同一个类不同方法间的同步

    对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法.假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方 ...

  7. Google Tensorflow 源码编译(二):Bazel<v0.1.0>

    这几天终于把tensorflow安装上了,中间遇到过不少的问题,这里记录下来.供大家想源码安装的参考. 安装环境:POWER8处理器,Docker容器Ubuntu14.04镜像. Build Baze ...

  8. ARM指令分类及其寻址方式

    ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: ...

  9. Vmware workstation 11 安装 RedHat 9 时 第二个iso文件 出现光盘无法被挂载

    通过虚拟机装linux系统,RedHat 9有3个iso文件,安装第一个iso文件时很顺利,安装完成第一个iso文件后,提示请插入光盘 需要继续安装第二个和第三个iso文件,点击菜单栏——虚拟机——设 ...

  10. OAF_开发系列24_实现OAF更新记录显示Record History(案例)

    20150716 Created By BaoXinjian