参考 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. ASP.NET Razor——ASP.NET Razor - C#代码语法

    Razor 同时支持 C# (C sharp) 和 VB (Visual Basic). 主要的 Razor C# 语法规则 Razor 代码块包含在 @{ ... } 中 内联表达式(变量和函数)以 ...

  2. [课程设计]Scrum 1.6 多鱼点餐系统开发进度

    [课程设计]Scrum 1.6 多鱼点餐系统开发进度(点餐页面按钮添加&修复) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4. ...

  3. 好的bootstrap文章

    http://www.cnblogs.com/gamehiboy/p/5176618.html http://www.cnblogs.com/landeanfen/p/5821192.html htt ...

  4. C#模拟键盘事件

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("USER3 ...

  5. 改写《python基础教程》中的一个例子

    一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...

  6. Java在Web项目中读取properties文件

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import ...

  7. winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法

    winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法 button的FlatAppearence属性下,设置BorderSize= ...

  8. linux tar

    转自:http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压 ...

  9. makefile函数

    http://www.cnblogs.com/tianyajuanke/archive/2013/02/16/2610276.html 通用步骤: 编译时,可以不知钉头文件,如果指定头文件,其作用是当 ...

  10. Nuke

    - Debugging python code IN nuke with Eclipse - Documents: http://www.thefoundry.co.uk/products/nuke- ...