function downLoad(url = null) {
return new Promise((res, rej) => {
let number = Math.random()
if (number > 0.5) {
setTimeout(() => {
res('succ')
}, 2000);
} else {
setTimeout(() => {
rej('succ')
}, 2000);
}
})
}
function requestImgs(imgsUrl, limit, downFnPro, againDownLoadLimit) {
let imgsReq = imgsUrl.map((url) => {
return {
exeDownLoad: () => downFnPro(url), downState: false, url
}
});
let tryAgainCount = 0
let errDownLoad = []
let unExeArr = []
let paddingExeArr = []
let succExe = []
let run = function () {
console.log(imgsReq, 'start')
for (let i = 0; i < imgsReq.length; i++) {
unExeArr = imgsReq.filter(e => e.downState == false)
paddingExeArr = imgsReq.filter(e => e.downState === 'padding')
errDownLoad = imgsReq.filter(e => e.downState === 'error')
if (paddingExeArr.length < limit && imgsReq[i].downState === false) {
imgsReq[i].downState = 'padding'
imgsReq[i].exeDownLoad().then(suc => {
imgsReq[i].downState = true
succExe.push(imgsReq[i])
run()
}, err => {
errDownLoad.push(imgsReq[i])
imgsReq[i].downState = 'error'
run()
}).catch((e) => {
errDownLoad.push(imgsReq[i])
imgsReq[i].downState = 'error'
run()
})
run()
}
}
if (errDownLoad.length > 0 && unExeArr.length == 0 && paddingExeArr.length == 0) {
unExeArr = [...errDownLoad].map(e => {
e.downState = false
})
if (tryAgainCount < againDownLoadLimit) {
run()
} else {
for (let i = 0; i < errDownLoad.length; i++) {
console.log(errDownLoad[i].url + ':' + againDownLoadLimit + '次尝试后下载失败!请刷新重试')
}
return
}
tryAgainCount++
} else if (errDownLoad.length == 0 && unExeArr.length == 0 && paddingExeArr.length == 0) {
console.log('全部下载成功', imgsReq)
return
}
}
run()
}