如果需要同时发送10个请求,如何防止丢失请求或者请求阻塞问题?还能完成性能优化?
function axios(){
return new Promise((resolve,reject)=>{
console.log('开始发送请求');
setTimeout(()=>{
console.log('服务器响应了------');
resolve('结果')
},1000)
})
}
方案一:Promise.all
let tasts = [axios(),axios(),axios(),axios(),axios(),axios(),axios(),axios(),axios(),axios()];
Promise.all(tasts).then(res=>{})
浏览器由于内核与版本不同。支持并发数量不同:
谷歌:6 8
火狐:3 6
低版本IE:3
所以,用这种方式会出现的情况: 会丢 会堵
方案二:Promise.then 一个一个来
axios().then(res=>{
return axios()
}).then(res=>{
return axios()
}).then(res=>{
return axios()
}).then(res=>{
return axios()
}).then(res=>{
return axios()
}).then(res=>{
return axios()
}).then(res=>{
return axios()
}).then(res=>{
return axios()
}).then(res=>
return axios()
})
弊端:请求时间太长了.....
优势:与方案一相比,这个方案会成功。
方案三:最优,利用Promise.all分片并发上传
理由:浏览器对并发业务兼容性最安全的数组 3 4
let arr = [
[axios(),axios(),axios()],
[axios(),axios(),axios(),axios()],
[axios(),axios(),axios()]
]
let result = []
Promise.all(arr[0]).then(res=>{
result = result.concat(res)
return Promise.all(arr[1])
}).then(res=>{
result = result.concat(res)
return Promise.all(arr[2])
}).then(res=>{
result = result.concat(res)
console.log(result);
})