function resolvePromise(promise, result, resolve, reject) {
if (promise === result) {
return reject(new TypeError('Chaining cycle detected for promise'));
}
if (result instanceof MyPromise) {
result.then(resolve, reject);
} else {
resolve(result);
}
}
class MyPromise{
constructor(executor){
this.status = "pending";
this.resolveList = [];
this.rejectList = [];
const resolve = (args)=>{
if(this.status === "pending"){
this.status = "fulfilled";
this.resolveList.forEach((callback) => callback(args));
}
}
const reject = (args) => {
if(this.status === "pending"){
this.status = "rejected";
this.rejectList.forEach((callback) => callback(args));
}
}
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
then(resolveCallback, rejectCallback){
resolveCallback = typeof resolveCallback === 'function' ? resolveCallback : (value) => value;
rejectCallback = typeof rejectCallback === 'function' ? rejectCallback : (reason) => { throw reason; };
const promise = new MyPromise((resolve, reject) => {
if (this.status === 'fulfilled') {
setTimeout(() => {
try {
const result = resolveCallback();
resolvePromise(promise, result, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
}
if (this.status === 'rejected') {
setTimeout(() => {
try {
const result = rejectCallback();
resolvePromise(promise, result, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
}
if (this.status === 'pending') {
this.resolveList.push(() => {
setTimeout(() => {
try {
const result = resolveCallback();
resolvePromise(promise, result, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
this.rejectList.push(() => {
setTimeout(() => {
try {
const result = rejectCallback();
resolvePromise(promise, result, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
}
});
return promise;
}
catch(onRejected) {
return this.then(null, onRejected);
}
// all promiseList列表中有一个失败 结果就为reject
all(promiseList){
const result = [];
return new MyPromise((resolve,reject)=>{
promiseList.map((item,i)=>{
// MyPromise.resolve()用于处理传入值不为Promise的情况
MyPromise.resolve(item).then((res)=>{
result[i] = res;
if(result.length === promiseList.length){
resolve(result)
}
},(err)=>{
reject(err)
})
})
})
}
race(promiseList){
return new MyPromise((resolve,reject)=>{
promiseList.map((item,i)=>{
// MyPromise.resolve()用于处理传入值不为Promise的情况
MyPromise.resolve(item).then((res)=>{
resolve(res)
},(err)=>{
reject(err)
})
})
})
}
retry(fn, count){
return new MyPromise((resolve, reject)=>{
const fnTemp = function(){
MyPromise.resolve(fn).then(res=>{
resolve(res)
}, (err) =>{
if(count === 0){
reject(err)
}else{
count--;
fnTemp()
}
})
}
return fnTemp
})
}
}
Promise的实现
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。