Promise的完整实现
let p = new Promise((resolve,reject)=>{
console.log('立即执行')
});
/*
两个函数任何一个被调用后, 另一个将不会被调用
1.
resolve()
reject() //无效
2.
reject()
resolve() //无效
3.
reject()
reject() //无效
*/
let p = new Promise((resolve,reject)=>{
resolve('成功')
reject('失败') //无效
});
let p = new Promise((resolve,reject)=>{
setTimeout(() => {
resolve('成功')
}, 0);
});
/*
[[PromiseState]]: 'pending',
[[PromiseResult]]: undefined
*/
console.log(p);
/*
[[PromiseState]]: 'fulfilled', [[PromiseResult]]: '成功'
*/
setTimeout(() => {
console.log(p);
}, 10);
/*
由于调用了reject, 因此对象状态从pending -> rejected
*/
let p = new Promise((resolve,reject)=>{
setTimeout(() => {
// p 从 pending转到rejected
reject('失败')
}, 0);
});
//提供了2个回调函数, rejected状态将调用第二个函数
p.then(res=>{
console.log("success:",res)
}, res=>{
//state: Promise [[PromiseState]]:
'rejected', [[PromiseResult]]: '失败'
console.log("state:",p)
});
/*
以下两者等价
p.then(null,res=>{
console.log('failed:',res)
})
//语法糖
p.catch(res=>{
console.log('failed:',res)
})
*/
let p = new Promise((resolve,reject)=>{
resolve('aaaa') //fulfilled状态
});
p.then(res=>{
console.log('success:',res) // 第一次调用
},res=>{
console.log('failed:',res) //不会调用
})
p.then(res=>{
console.log('第二次') // 还会调用
})
//p.then()p.then()p.then() 都将依次调用
let p = new Promise((resolve,reject)=>{
// p 将从pending转到fulfilled
resolve('aaaa')
});
//注册回调函数
let ret = p.then(res=>{
console.log('success:',res)
/*
不写 return , 默认:
return new Promise((resolve,reject)=>{
resolve(undefined);
})
如果写了 return '1111':
return new Promise((resolve,reject)=>{
resolve('1111');
})
*/
},res=>{
console.log('failed:',res)
})
setTimeout(() => {
/*
[[PromiseState]]: 'fulfilled', [[PromiseResult]]: undefined
*/
console.log('ret:',ret)
}, 10);
let p = new Promise((resolve,reject)=>{
// p.[[PromiseState]]会变成'rejected'
setTimeout(() => {
reject('失败')
}, 0);
});
let p1 = p.then(res=>{
console.log("success:",res) //不会执行
}, res=>{
console.log("failed:",res)
/*
new Promise((resolve,reject)=>{
resolve(123);
});
*/
return 123;
});
setTimeout(() => {
//[[PromiseState]]: 'rejected', [[PromiseResult]]: '失败'
console.log('p:',p)
//[[PromiseState]]: 'fulfilled', [[PromiseResult]]: 123
console.log('p1:',p1)
}, 10);
let p = new Promise((resolve,reject)=>{
// p 从pending 变成 rejected
setTimeout(() => {
reject('失败')
}, 0);
});
/*
当p在调用reject时会调用then中注册过的函数
当前没有 rejected 状态对应的函数
因此 p 的状态和数据将传递给 p1
*/
let p1 = p.then(res=>{
console.log("success:",res)
});
// p1 注册了 rejected 状态该使用的回调
// p1 返回的新对象将是一个 fulfilled的状态
let p2 = p1.catch(res=>{
console.log('catch:',res)
})
setTimeout(() => {
// [[PromiseState]]: 'rejected', [[PromiseResult]]: '失败'
console.log('p:',p)
//[[PromiseState]]: 'rejected', [[PromiseResult]]: '失败'
console.log('p1:',p1)
//[[PromiseState]]: 'fulfilled', [[PromiseResult]]: undefined,
console.log('p2:',p2)
}, 100);
let p = new Promise((resolve,reject)=>{
// p 从pending 将转到 fulfilled
setTimeout(() => {
resolve('失败')
}, 0);
});
// 由于p.then没有对应函数,因此p的状态及结果都将复制给p1
let p1 = p.then(null);
// p1只处理了出错的情况,没处理成功的情况,因此p2新对象也将复制p1的状态和结果
let p2 = p1.catch(res=>{
console.log('catch:',res)
})
setTimeout(() => {
// PromiseState: 'fulfilled', [[PromiseResult]]: '失败',
console.log('p:',p)
// PromiseState: 'fulfilled', [[PromiseResult]]: '失败',
console.log('p1:',p1)
// PromiseState: 'fulfilled', [[PromiseResult]]: '失败',
console.log('p2:',p2)
}, 100);
let p = new Promise((resolve,reject)=>{
// p 将由pending 转成rejected
reject('我在哪里');
});
/*
第一个then:
p未处理rejected函数,返回新Promise复制了p的状态及数据
第二个then:
新Promise对象的状态是rejected
在then中提供了函数,因此调用此函数,
同时返回了一个fulfilled状态的新对象,新对象的数据为回调返回值
第三个then:
状态为fulfilled的对象在then中有对应函数,
此对象的数据为前一个返回值
*/
p.then(res=>{
console.log('第一个 then 的success函数 ', res);
})
.then(null,res=>{
console.log('相当于catch ', res);
return '我成功了'
})
.then(res=>{
console.log('输出了什么 :' , res)
})
/*
相当于catch 我在哪里
输出了什么 : 我成功了
*/
let p = new Promise((resolve,reject)=>{
// p 由 pending转为 rejected
reject('我在哪里');
});
//p 有对应的回调函数
let p1 = p.catch(res=>{
console.log('catch :' , res)
throw '哈哈哈哈'
/*
throw 相当于
return Promise.reject('哈哈哈哈');
*/
})
//[[PromiseState]]: 'rejected', [[PromiseResult]]: '哈哈哈哈'
p1.catch(res=>{
console.log(p1);
})
let p = new Promise((resolve,reject)=>{
resolve('我在哪里');
});
let p1 = p.then(res=>{
/*
相当于
return Promise.reject('哈哈哈哈');
*/
throw '哈哈哈哈'
})
//与上面代码一致
p1.catch(res=>{
console.log(p1);
})
let p = new Promise((resolve,reject)=>{
resolve('我在哪里');
});
// p转为fulfilled,调用第一个函数
p.then(res=>{
console.log('resolve :' , res)
return Promise.reject("哈哈哈哈")
})
.then(()=>{
/*
新对象为rejected,then中没有对应回调,此函数将被忽略
同时返回一个新对象,复制当前对象的rejcted状态及数据
*/
console.log('略过此,并返回一个新Promise状态为reject')
return 123;
})
.then(null,res=>{
/*
当前对象的状态及数据从上一个对象复制得来,
当前对象的then有对应回调.
因此这部分被执行
此对象返回的新对象将是一个fulfilled状态,数据为当前的返回值
*/
console.log('我将被调用:',res)
return 456;
})
.then(res=>{
//当前对象是一个fulfilled状态,有对应回调,因此执行
console.log('最终在这里:',res)
})
let p = new Promise((resolve,reject)=>{
resolve('我在哪里');
});
p.then(res=>{
return new Promise((s,r)=>{
// 返回的新对象状态为 rejected,数据为'哈哈哈哈'
setTimeout(() => {
r('哈哈哈哈')
}, 1000);
});
})
.then(()=>{
//不会执行, 返回一个新对象将复制当前的状态及数据
console.log('略过此,并返回一个新Promise状态为reject')
return 123;
})
.then(null,res=>{
/*
有对应回调
执行并返回一个 fulfilled状态,数据为456的新对象
*/
console.log('我将被调用:',res)
return new Promise((s,r)=>{
setTimeout(() => {
s(456);
}, 500);
});
})
.then(res=>{
console.log('最终在这里:',res)
})
Promise的完整实现