开篇点题: 实现一个函数,接收一个异步promise数组,保存成功的结果,对失败的结果实现最多n次的重新请求,返还最终结果 例子:
const p1 = Promise.resolve(1);
const p2 = new Promise((resolve, reject) => {
return resolve(2)
});
const p3 = new Promise((resolve, reject) => {
resolve(3)
});
const p4 = ()=>Promise.reject('error')
运行函数func([p1,p2,p3,p4]),重新请求n次p4后抛出error,最终结果返回[1,2,3],
这道题是本人两年前校招阿里一面的手写题,当时一脸懵逼不知如何是好,之后也尝试过几次但均以失败告终,现在终于完成,特此记录!
const p1 = Promise.resolve(1);
const p2 = new Promise((resolve, reject) => {
return resolve(2)
});
const p3 = new Promise((resolve, reject) => {
resolve(3)
});
const p4 = ()=>Promise.reject('error')
const retryPromise = (operation, maxRetries, delay) => {
return new Promise((resolve,reject)=>{
let retries = 0
const execute = () => {
operation().then(resolve).catch(error => {
retries++
console.log('retrying...',retries)
if (retries <= maxRetries) {
setTimeout(execute, delay)
} else {
reject(error)
}})
}
execute()
})
}
const fn = () => {
const random = Math.random()
if (random < 0.2) {
return Promise.resolve('success')
} else {
return Promise.reject('error')
}
}
// retryPromise(
// () => Promise.reject('error'),
// 3, // 最大重试次数
// 1000 // 重试间隔时间(毫秒)
// )
// .then(result => {
// console.log(result);
// })
// .catch(error => {
// console.error(error);
// });
const ajaxArray = [fn,fn,fn,fn]
const result = []
ajaxArray.forEach((item, index) => {
retryPromise(
fn,
3, // 最大重试次数
1000 // 重试间隔时间(毫秒)
)
.then(res => {
result.push(res)
})
.catch(error => {
// console.error(error);
result.push('timeout!!!')
});
})
setTimeout(()=>{
console.log(result)
},5000)