const PENDING='PENDING';
const FULFILLED='FULFILED';
const REJECTED='REJECTED';
function Promies(){
this.status = PENDING;
this.value=undefined;
this.reason=undefined;
}
function Promies(){
this.status = PENDING;
this.value=undefined;
this.reason=undefined;
let that = this; //reslve,reject要修改promise实例对象的状态,要缓存下来
function resovle(value){
//先不考虑value为promise
setTimeout(()=>{
if(that.status === PENDING){
that.status = FULFILLED;
that.value = value
}
})
}
function reject(reason){
setTimeout(()=>{
if(that.status === PENDING){
that.status = REJECTED;
that.reason = reason;
}
})
}
}
function Promies(excutor){ ... }
try {
excutor(resovle,reject)
} catch (error) {
reject(error)
}
Promies.prototype.then = function(onFulfiled,onRejected){
let that = this; //缓存当前调用then的promise对象实例
let newPromise; //then返回新的promise
onFulfiled = typeof onFulfiled ==='function'?onFulfiled :value=>value;
onRejected = typeof onRejected === 'function'?onRejected:reason=>{throw reason}
if(that.status === FULFILLED){ //异步操作已完成
return newPromise = new Promies((resovle,reject)=>{
setTimeout(()=>{
try {
let x = onFulfiled(that.value)
//x 为promise情况先不考虑
} catch (error) {
reject(error)
}
})
})
}
if(that.status === REJECTED){
return newPromise = new Promies((resovle,reject)=>{
setTimeout(()=>{
try {
let x = onRejected(that.reason)
//x 为promise情况先不考虑
} catch (error) {
reject(error)
}
})
})
}
}
function Promies(excutor){
this.status = PENDING;
this.value=undefined;
this.reason=undefined;
this.onFulfiledCallbacks = []; // +
this.onRejectedCallbacks = []; // +
let that = this; //reslve,reject要修改promise实例对象的状态,要缓存下来
function resovle(value){
//先不考虑value为promise
setTimeout(()=>{
if(that.status === PENDING){
that.status = FULFILLED;
that.value = value
that.onFulfiledCallbacks.forEach(callback => {
callback(that.value)
}); // +
}
})
}
function reject(reason){
setTimeout(()=>{
if(that.status === PENDING){
that.status = REJECTED;
that.reason = reason;
that.onRejectedCallbacks.forEach(callback=>{
callback(that.reason)
}) // +
}
})
}
try {
excutor(resovle,reject)
} catch (error) {
reject(error)
}
}
Promise原型连中的then新增pengding判断
if(that.status === PENDING){
return newPromise = new Promies((resovle,reject)=>{
that.onFulfiledCallbacks.push((value)=>{ //这儿部直接push onFulfiled 1.不清楚onFulfiled执行情况和返回的是不是promise
try {
let x = onFulfiled(value)
//x 为promise情况先不考虑
} catch (error) {
reject(error)
}
})
that.onRejectedCallbacks.push((reason)=>{
try{
let x = onRejected(reason);
//x 为promise情况先不考虑
}catch(error){
reject(error)
}
})
})
}
function resovle(value){
//value为promise
if(value instanceof Promies){
return value.then(resovle,reject) //这儿要return,因为要将该promise对象状态,交给value来维护
}
setTimeout(()=>{
if(that.status === PENDING){
that.status = FULFILLED;
that.value = value
that.onFulfiledCallbacks.forEach(callback => {
callback(that.value)
}); // +
}
})
}
function resovlePromise(promise2,x, resovle,reject){
if(promise2 === x )
return reject(new TypeError('循环引用'))
let called= false
if( x instanceof Promies){
if(x.status === PENDING){
x.then(y=>{
resovlePromise(promise2,y,resovle,reject)
})
}else{
x.then(resovle,reject)
}
}else if(x != null && ((typeof x === 'object') || (typeof x === 'function'))){
//是否具有then函数
try {
let then = x.then;
if(typeof then === 'function'){
then.call(x,y=>{
if(called) return;
called = true;
resovlePromise(promise2,y,resovle,reject)
},reason=>{
if(called) return
called = true;
reject(reason)
})
}else{
resovle(x)
}
} catch (error) {
if(called) return;
called = true
resovle(x)
}
}else{
resovle(x)
}
}
promise.all = function(promises){
return new Promies((resovle,reject)=>{
let done = gen(promises.length,resovle)
promises.forEach((promise,index)=>{
promise.then((value)=>{
done(index,value)
},reject)
})
})
}
function gen(length,resovle){
let count = 0;
let values = [];
return function(i,value){
values[i] = value
if(++count === length)
resovle(values)
}
}
Promies.race = function(promises){
return new Promies((resovle,reject)=>{
promises.forEach((promise)=>{
promise.then(resovle,reject)
})
})
}
«««< HEAD:javascript/async.md ``` Promise.prototype.catch = function(onRejected){ return this.then(null,onRejected) }
Promise.resovle =function(value){
return new Promise(resolve=>resolve(value))
}
Promise.reject = function(reason){
return new Promise(reject=>reject(reason))
}
Promise.deferred = function(){
let defer = {}
defer.promise = new Promise((resovle,reject)=>{
defer.resolve = resovle;
defer.reject = reject
})
return defer;
}
try{
module.exports = Promise
}catch(e){
console.log(e)
}
```
8217db4ad6c201681dbb5b7c1f205937275d9384:javascript/Promise.md