1.大量请求如何控制并发?
- 浏览器发起的请求最大并发数量一般都是
6~8
个,这是因为浏览器会限制同一域名下的并发请求数量,以避免对服务器造成过大的压力。
import axios from 'axios'
export const handQueue = (
reqs
) => {
reqs = reqs || []
const requestQueue = (concurrency) => {
concurrency = concurrency || 6
const queue = []
let current = 0
const dequeue = () => {
while (current < concurrency && queue.length) {
current++;
const requestPromiseFactory = queue.shift()
requestPromiseFactory()
.then(() => {
})
.catch(error => {
console.log(error)
})
.finally(() => {
current--
dequeue()
});
}
}
return (requestPromiseFactory) => {
queue.push(requestPromiseFactory)
dequeue()
}
}
const enqueue = requestQueue(6)
for (let i = 0; i < reqs.length; i++) {
enqueue(() => axios.get('/api/test' + i))
}
}
2.同一个页面三个组件同时请求同一个API
const fetchUser = id => {
return new Promise(resolve => {
setTimeout(() =>{
console.log('fetch:', id)
resolve(id)
})
})
}
const cache = {}
const cacheFetchUser = id => {
if(cache[id]){
return cache[id]
}
cache[id] = fetchUser(id)
return cache[id]
}
cacheFetchUser(3).then((id) => console.log(id))
cacheFetchUser(3).then((id) => console.log(id))
cacheFetchUser(3).then((id) => console.log(id))