function resolve_promise_value(promise,value) {//PromiseA+的完成
var then;
/*
ret false 申明没有实行promise._resolve里的函数
ret true 申明实行了promise._resolve里的函数
ret error 申明实行promise._resolve里的函数过程当中涌现毛病
*/
var ret = false;
/*
resolve(promise)和实行resolve状况时的回调函数后返回的效果都须要实行resolve(promise,value)
*/
if (value === promise) {//传进来的对象不能即是当前的Promise对象
promise.reject(new TypeError('TypeError'));
} else if (value && value instanceof Promise){//回调返回的值或许resolve的值是Promise对象时须要守候该Promise对象的状况变动
value.then(promise.resolve.bind(promise),promise.reject.bind(promise));
} else if (type(value) === 'Object' || type(value) === 'Function') {
try {
then = value.then;
} catch(getThenErr) {
promise.reject(thenErr);
}
if (type(then) === 'Function') {
try {
then.call(value,promise.resolve.bind(promise),promise.reject.bind(promise));
} catch(callThenErr) {
if (promise.state === 'pending') {
promise.reject(callThenErr);
}
}
} else {
ret = true;
var fn;
promise.setState('fulfilled');//设置当前Promise状况的状况和值
promise.value = value;
var error;
while (fn = promise._resolve.shift()) {//实行resolve回调行列里的函数
try {
if (typeof fn == 'function') {
var result = fn(value);
promise.value = result;
}
} catch (err) {
ret || (ret = err);//纪录第一个实行失足的函数的非常信息
}
}
}
} else {
ret = true;
var fn;
promise.setState('fulfilled');//设置当前Promise状况的状况和值
promise.value = value;
var error;
while (fn = promise._resolve.shift()) {//实行resolve回调行列里的函数
try {
if (typeof fn == 'function') {
var result = fn(value);
promise.value = result;
}
} catch (err) {
(ret instanceof Error) || (ret = err);
}
}
}
if (promise.next) {
if (ret === true) {
resolve_promise_value(promise.next,promise.value);
}
else if (ret instanceof Error){
promise.next.reject(ret);
}
}
}
function type(arg) {//推断对象范例函数
return Object.prototype.toString.call(arg).match(/ (\w+)/)[1];
}
function Promise(fn,value,state) {
if (!(this instanceof Promise)) {//防备不必new挪用Promise函数
return new Promise(fn);
}
this._resolve = [];//Promise对象的fulfilled时实行的回调行列
this._reject = [];//Promise对象的rejected时实行的回调行列
this.next = null;//实行下一个Promise对象
this.value = value || null;//当前Promise对象的值
this.state = state || 'pending';//当前Promise对象的状况
this.id = Promise.idFactory();
/*
new 的时刻假如有函数,就实行该函数,把resolve和reject函数作为参数传进去,而且绑定对应的Promise对象
*/
try {
fn && fn(this.resolve.bind(this),this.reject.bind(this));
} catch (e) {
this.reject(e);
}
}
Promise.prototype = {
equal: function(promise) {//依据id推断两个Promise对象是不是相称
return promise && (type(promise.then) === 'Function') && (this.id === promise.id);
},
resolve: function(value) {
if(this.state !== 'pending'){
return;
}
setTimeout((function() {
resolve_promise_value(this,value)
}).bind(this),0);
},
setState: function(state) {//设置Promise对象的状况
this.state = state;
},
reject: function(value) {
if (this.state === 'pending') {
setTimeout((function() {
this.setState('rejected');//设置Promise对象状况
this.value = value;//纪录Promise对象对应的值
var fn;
var error;
if (this._reject.length === 0) {
if (this.next) {
this.next.reject(value);
}
return;
}
while (fn = this._reject.shift()) {//实行reject回调函数
try {
if (typeof fn == 'function') {//关于回调函数行列,只需纪录末了一个函数的实行效果
var result = fn(value);
this.value = result;
}
} catch (err) {//捕捉非常,保证回调行列里的函数每一个都被实行
error || (error = err);
}
}
if (this.next) {
if (error) {
this.next.reject(error);
}
/*
实行完当前Promise对象的回调后,假如Promise链上有下一个Promise对象,继承实行,当前的Promise对象的值传进去
假如error为true则申明上面代码实行中有非常,把非常对象传给下一个Promise对象
*/
else {
resolve_promise_value(this.next,result);
}
}
}).bind(this),0)
}
},
then: function(resolve,reject) {//增添resolve和reject回调
if (this.state != 'pending') {//假如当前Promise对象已resolve或reject则依据当前Promise对象状况异步实行传进来的resolve或reject函数
this.state === 'fulfilled' ? (resolve = resolve || function() {}) : (reject = reject || function() {});
setTimeout(this.state === 'fulfilled' ? resolve.bind(null,this.value) : reject.bind(null,this.value),0);
return;
}
(type(resolve) === 'Function') && this._resolve.push(resolve);//纪录resolve回调
(type(reject) === 'Function') && this._reject.push(reject);
this.next = new Promise();//返回一个新的Promise对象
return this.next;
},
catch: function(reject) {//then(undefined,callback)的语法糖
return this.then(void 0,reject);
}
}
Promise.all = function(promiseArr) {
if (type(promiseArr) !== 'Array') {//参数须要Promise数组
new Error('need a Array');
}
var count = 0;
var result = [];//纪录每一个Promise的效果
var ret = new Promise();//返回新的Promose对象
for (var i = 0; i< promiseArr.length ;i++) {
promiseArr[i].then((function(i) {//每一个Promise fulfilled后纪录效果而且推断是不是悉数Promise对象已fulfilled
return function(value) {
result[i] = value;
count++;
if (count === promiseArr.length) {//悉数Promise fulfilled的话就实行resovle
ret.resolve(result);
}
}
})(i),function(value) {
if (ret.state === 'pending') {//有一个Promise对象reject而且ret照样pending状况的话就直接返回
ret.reject(value);
}
})
}
return ret;
}
Promise.race = function(promiseArr) {
if (type(promiseArr) !== 'Array') {
new Error('need a Array');
}
var ret = new Promise();
for (var i = 0; i< promiseArr.length ;i++) {
promiseArr[i].then(function(value) {
if (ret.state === 'pending') {//有一个Promise对象resolve的话就返回,而且摒弃其他的Promise对象的效果
ret.resolve(value);
}
},function(value) {
if (ret.state === 'pending') {//有一个Promise对象reject的话就返回,而且摒弃其他的Promise对象的效果
ret.reject(value);
}
});
}
return ret;
}
Promise.resolve = function(arg) {
if (arg && typeof arg.then === 'function') {//参数是Promise对象的话直接返回
return arg;
} else {//否则用参数组织一个Promise对象
var result = new Promise(null,arg,'fulfilled');
//result.resolve(arg);
return result;
}
}
Promise.reject = function(arg) {//同resolve
if (arg && typeof arg.then === 'function') {
return arg;
} else {
var result = new Promise(null,arg,'reject');
//result.reject(arg);
return result;
}
}
Promise.idFactory = (function() {//id组织工场,id用于比较是不是是同一个Promise对象
var _id = 0;
return function() {
return _id += 1;
}
})();
module.exports = Promise;
尝试完成一个Promise
原文作者:theanarkh
原文地址: https://segmentfault.com/a/1190000008395993
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://segmentfault.com/a/1190000008395993
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。