1psomise,then
function MyPromise(executor){var _this = this_this.state = 'pending'; //状态_this.value = undefined; //成功结果_this.reason = undefined; //失败原因_this.onFulfilled = [];//成功的回调_this.onRejected = []; //失败的回调function resolve(value) {if(_this.state=='pending'){_this.state = 'fulfilled'_this.value = value//一旦resolve执行,调用成功数组的函数_this.onFulfilled.foreach(fn=>{fn( _this.value)})}}function reject(reason) {if(_this.state=='pending'){_this.state = 'rejected'_this.value = reason// 一旦reject执行,调用失败数组的函数_this.onRejected.forEach(fn=>fn( _this.reason));}}try { //executor也会可能存在异常,用try/catch来捕获异常情况:executor(resolve, reject);} catch (e) {reject(e);}
}MyPromise.prototype.then = function (onFulfilled, onRejected) {if(this.state === FULFILLED){onFulfilled(this.value)}if(this.state === REJECTED){onRejected(this.reason)}if(this.state === PENDING){this.onFulfilled.push(onFulfilled)this.onRejected.push(onRejected)}
};
测试demo:
var myP = new MyPromise(function(resolve, reject){console.log('执行')setTimeout(function(){reject(3)}, 1000)
});myP.then(function(res){console.log(res)
},function(err){console.log(err)
});
2、all方法
Promise.all = function (iterator) { let count = 0//用于计数,当等于len时就resolvelet len = iterator.lengthlet res = []//用于存放结果return new Promise((resolve,reject) => {for(var item of iterator){Promise.resolve(item)//先转化为Promise对象.then((data) => {res[count++] = dataif(count === len){resolve(res)}}).catch(e => {reject(e)})}})
}
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {setTimeout(resolve, 100, 'foo');
});Promise.all([promise1, promise2, promise3]).then(function(values) {console.log(values);
});
3、race方法
Promise.race = function (iterators) { return new Promise((resolve,reject) => {for (const p of iterators) {Promise.resolve(p).then((res) => {resolve(res)}).catch(e => {reject(e)})}})}
var promise1 = new Promise(function(resolve, reject) {setTimeout(resolve, 500, 'one');
});var promise2 = new Promise(function(resolve, reject) {setTimeout(resolve, 100, 'two');
});Promise.race([promise1, promise2]).then(function(value) {console.log(value);// Both resolve, but promise2 is faster
});