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
 | 
						|
}
 |