简单的 Promise 实现
参考 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 实现的更多相关文章
- 一个简单的Promise 实现
用了这么长时间的promise,也看了很多关于promise 的文章博客,对promise 算是些了解.但是要更深的理解promise,最好的办法还是自己实现一个. 我大概清楚promise 是对异步 ...
- 实现简单的promise
只考虑成功时的调用,方便理解一下promise的原理promise的例子: 1. 接下来一步步实现一个简单的promise step1:promise 接受一个函数作为构造函数的参数,是立即执行的,并 ...
- 如何用原生JS实现一个简单的promise
我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...
- 简单版 Promise/A+,通过官方872个测试用例
promise 标准 在实现 Promise 之前要清楚的是 JavaScript 中的 Promise 遵循了 Promises/A+ 规范,所以我们在编写 Promise 时也应当遵循这个规范,建 ...
- 聊一聊看似简单的Promise.prototype.then()方法
Promise.prototype.then() Proise实例的then方法是定义在原型对象Promise.prototype上的,它的作用是为Promise实例添加状态改变时的回调函数. 该方法 ...
- 简单模拟 Promise
class promise { constructor(fn) { this.data = null; this.err = null; this.isPromise = false; this.er ...
- [手写系列] 带你实现一个简单的Promise
简介 学习之前 需要先对Promise有个基本了解哦,这里都默认大家都是比较熟悉Promise的 本次将带小伙伴们实现Promise的基本功能 Promise的基本骨架 Promise的then Pr ...
- 简单的 Promise 实现 一
const Promise = function(fn){ let state = { pending: "pending", fulfilled: "fulfilled ...
- 手写简单的promise
function Promise(fn) { var that = this; this.status = "pedding"; this.value = undefined; / ...
随机推荐
- (转) Deep Learning Research Review Week 2: Reinforcement Learning
Deep Learning Research Review Week 2: Reinforcement Learning 转载自: https://adeshpande3.github.io/ad ...
- VS2010 中 Entity Framework 多数据库并存方法
选中相应数据库生成的 *.edmx文件,然后在属性中找到“自定义工具命名空间”,为每个EF数据集设置不同的命名空间,这样每个数据库生成的代码就会被隔离在不同的命名空间,即使同名类型也就不会相互影响了.
- unity, reduce android size
参考: https://www.youtube.com/watch?v=TYSmf_zgtZo http://stackoverflow.com/questions/41087220/how-to-u ...
- React组件生命周期过程说明
来自kiinlam github94 实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidM ...
- ecstore-app接口
接口调用方式: 接口完整地址为:http://域名/index.php/wapapp/请求地址 比如获取商品信息就是 http://域名/index.php/wapapp/product.html 提 ...
- python3.5学习笔记--一个简单的图片爬虫
参考资料:http://v.qq.com/boke/page/q/g/t/q01713cvdgt.html 目的:爬取网站图片 实际上以上链接的视频中已经将整个过程说的非常明白了,稍微有点计算机基础的 ...
- jquery深拷贝和浅拷贝
var obj1 = { a: 1 };var obj2 = { b: {bbb: 2} };function Clone(){//浅拷贝 拷贝到obj1值会被改变 在一个栈中 $.extend(ob ...
- gcc警告: warning: dereferencing type-punned pointer will break strict-aliasing rules
Q: 在高优化级别下,不同类型指针之间的强制类型转换可能会触发以下警告: warning: dereferencing type-punned pointer will break strict-al ...
- Displaying Bitmaps Efficiently 显示图片相关
http://developer.android.com/training/displaying-bitmaps/index.html .手机内存资源有限 .Bitmap占用的内存大 .App有时需要 ...
- 公司系统的license授权
在我的电脑的myeclipse的whnaproject项目下.可直接编译生成license.xml中所需要的授权码. 引用了spring-license-0.02.jar. package com.w ...