一直对Promise没有仔细看过,抽空一天把Prmose研究了下,下面是简单的实现过程:
附上Promise/A标准文档链接:https://promisesaplus.com/
(function(w) { function Promise(fn) {
//函数参数验证 printFnErrorInfo(fn); this.status = "pending"; executor(fn, this); }
Promise.resolve = function(value) { if(this == Promise) { return new Promise(function(resolve, reject) { resolve(value); }); } if(this.status != "pending") { return; } this.status = "fulfilled" handleResult(this.status, value, this); }
Promise.reject = function(value) { if(this == Promise) { return new Promise(function(resolve, reject) { reject(value); }); } if(this.status != "pending") { return; } status = "rejected" handleResult(status, value, this) }
Promise.prototype.then = function(onFulfilled, onRejected) { this._onFulfilled = onFulfilled; this._onRejected = onRejected return new Promise(function(resolve, reject) {}); }
function handleResult(status, value, ctx) { setTimeout(function() { var result; if(status == "fulfilled") { result = ctx._onFulfilled(value); } else if(status == "rejected") { result = ctx._onRejected(value); } if(isPormise(result)) { //如果是Promise对象,将默认的处理函数赋值给新的Promise对象,这是处理链式执行的关键 ctx.then = result; result._onFulfilled = ctx.then._onFulfilled; result._onRejected = ctx.then._onRejected } else { ctx.then && ctx.then._onFulfilled && ctx._onFulfilled(result); } }); }
function executor(fn, ctx) { var retResult = fn(Promise.resolve.bind(ctx), Promise.reject.bind(ctx)); }
function printFnErrorInfo() { var fns = Array.prototype.slice.call(arguments, 0); if(!fns || fns.length == 0) { throw new Error("Promise resolver undefined is not a function"); } fns.forEach(function(fn, i) { if(!typeof fn === 'function') { throw new Error("Promise resolver " + fn + " is not a function"); } })
}
function isPormise(obj) { return obj && obj.constructor === Promise; } w.Promise = Promise; })(window);