irc_web/.svn/pristine/8f/8fdd1849ec091b0367f94907608...

87 lines
2.1 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
}