记录一次最复杂的promise混合手写题!

62 阅读1分钟

开篇点题: 实现一个函数,接收一个异步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)