方案1: 请求队列
export
default
class RequestQueue {
constructor(maxConcurrent
) {
this.maxConcurrent = maxConcurrent;
this.currentConcurrent = 0
;
this.queue = []
;
this.requestId = 0
;
}
add(request, meta = {
}
) {
return
new Promise((resolve, reject
) =>
{
const id = ++
this.requestId;
this.queue.push({
id,
request: (
) =>
request(
).then(res =>
({
id,
res
}
)
)
,
resolve,
reject,
meta,
}
)
;
this.processQueue(
)
;
}
)
}
processQueue(
) {
while (
this.queue.length >
0 &&
this.currentConcurrent <
this.maxConcurrent) {
const task =
this.queue.shift(
)
;
this.currentConcurrent++
;
task.request(
)
.then(({
id,
res
}
) =>
{
task.resolve({
id,
meta: task.meta,
data: res
}
)
;
}
)
.catch(task.reject)
.finally((
) =>
{
this.currentConcurrent--
;
this.processQueue(
)
;
}
)
;
}
}
}
组件调用
import request from '@/utils/request.js'
;
import RequestQueue from '@/utils/RequestQueue.js'
;
const requestQueue =
new RequestQueue(3
)
;
const urls = [
{
url: '/slider/getSliders'
,
method: ''
,
data: ''
,
id: 1
,
reqType: 'getSliders'
}
,
{
url: '/course/mostNew'
,
method: 'post'
,
data: newCoursePageInfo,
id: 2
,
reqType: 'mostNew'
}
,
{
url: '/course/search'
,
method: 'post'
,
data: interestCoursePageInfo,
id: 3
,
reqType: 'search'
}
]
;
const fetchData = ({
url, method, data
}
) =>
{
return request(url, data, method).then((res
) =>
{
return res;
}
)
;
}
;
const requests = urls.map((url
) =>
(
) =>
fetchData(url)
)
;
onLoad((
) =>
{
Promise.all(requests.map((req, idx
) => requestQueue.add(req, {
originalIndex: idx, reqType: urls[idx].reqType
}
)
)
).then((results
) =>
{
results.forEach(({
meta, data
}
) =>
{
switch (meta.reqType) {
case 'getSliders':
swiperList.value = data.list;
break
;
case 'mostNew':
interestCouseInfo.value.push(...data.pageInfo.list)
;
break
;
case 'search':
newCourseInfo.value = data.pageInfo.list.slice(3
, 9
)
;
break
;
}
console.log(`请求${meta.originalIndex
}(${meta.reqType
})结果:`
, data)
;
}
)
;
}
)
;
}
)
;
说明:
- reqType: 请求唯一标识符,用于将并行发出的请求与响应回的数据对应上
- request: 对axios做的二次封装,函数fetchData 发出的请求就好比在api文件中的请求函数
只需在 对象urls变动url(id可不需要,唯一标识符必须) 和在 results赋值即可