88 lines
2.2 KiB
Plaintext
88 lines
2.2 KiB
Plaintext
const taskPool = [] // 请求池
|
|
let numRequest = 0 // 正在执行数量
|
|
const maxRequest = 4 // 可配置
|
|
let taskTimer // 轮询的定时器
|
|
const cachedTask = {} // 存放的任务数据
|
|
|
|
// 预加载池的添加
|
|
function addTaskIntoPool(task) {
|
|
return new Promise((resolve, reject) => {
|
|
const cache = cachedTask[task.key]
|
|
const subscribe = (executeRes) => {
|
|
if (executeRes.success) {
|
|
resolve(executeRes.res)
|
|
} else {
|
|
reject(executeRes.err)
|
|
}
|
|
}
|
|
const priority = (task.priority || task.priority === 0) || 999
|
|
if (cache) {
|
|
cache.priority = priority
|
|
const callbacks = cache.callbacks || []
|
|
callbacks.push(subscribe)
|
|
} else {
|
|
task.callbacks = [subscribe]
|
|
cachedTask[task.key] = task
|
|
taskPool.push(task)
|
|
}
|
|
})
|
|
}
|
|
// 执行下载
|
|
function executeTask() {
|
|
if (taskPool.length > 0) {
|
|
sortTaskPool()
|
|
const executeRequest = maxRequest - numRequest
|
|
if (executeRequest > 0) {
|
|
for (let i = 0; i < executeRequest; i++) {
|
|
const task = taskPool.shift()
|
|
if (!task) {
|
|
return
|
|
}
|
|
numRequest++
|
|
task.execute().then((res) => {
|
|
numRequest--
|
|
task.callbacks && task.callbacks.map(callback => {
|
|
callback({ success: true, res })
|
|
})
|
|
executeTask()
|
|
}, (err) => {
|
|
numRequest--
|
|
task.callbacks && task.callbacks.map(callback => {
|
|
callback({ success: false, err })
|
|
})
|
|
delete cachedTask[task.key]
|
|
executeTask()
|
|
})
|
|
}
|
|
}
|
|
} else {
|
|
startTaskTimer()
|
|
}
|
|
}
|
|
function sortTaskPool() {
|
|
if (taskPool.length > 0) {
|
|
taskPool.sort((a, b) => a - b)
|
|
}
|
|
}
|
|
// 轮询检查请求池中是否有请求需要执行
|
|
function startTaskTimer() {
|
|
taskTimer = setInterval(() => {
|
|
if (taskPool.length > 0) {
|
|
stopTaskTimer()
|
|
executeTask()
|
|
}
|
|
}, 500)
|
|
}
|
|
// 停止轮询
|
|
function stopTaskTimer() {
|
|
clearInterval(taskTimer)
|
|
taskTimer = null
|
|
}
|
|
|
|
export default {
|
|
addTaskIntoPool,
|
|
executeTask,
|
|
startTaskTimer,
|
|
stopTaskTimer
|
|
}
|